Rumah > Soal Jawab > teks badan
Class - Person
@interface Person : NSObject
@property (nonatomic, copy) NSString *lastName;
@end
@implementation Person
@synthesize lastName = _lastName;
- (instancetype)init {
self = [super init];
if (self) {
_lastName = @"abc";
}
return self;
}
- (NSString *)lastName {
return _lastName;
}
- (void)setLastName:(NSString *)lastName {
_lastName = lastName;
}
@end
Class - SmithPerson
@interface SmithPerson : Person
@end
@implementation SmithPerson
- (instancetype)init {
self = [super init];
if (self) {
self.lastName = @"aaa";
}
return self;
}
@end
Perkara di atas tidak mengatasi kaedah getter/setter lastName dalam subkelas SmithPerson Saya boleh menetapkan semula nilai melalui self.lastName dalam init, tetapi jika saya menulis semula getter/setter dalam subkelas, bagaimanakah saya menetapkannya semula? self.lastName akan memanggil kaedah penetap subkelas Jika nilai ditetapkan dalam penetap seperti ini, ia akan menjadi gelung tak terhingga
- (void)setLastName:(NSString *)lastName {
self.lastName = lastName;
}
Selain itu: Jika anda menukar kaedah init Person dan SmithPerson kepada yang berikut, dan subkelas menulis semula getter/setter bagi lastName kelas induk:
Person
- (instancetype)init {
self = [super init];
if (self) {
**self.lastName = @"abc";**
}
return self;
}
SmithPerson
- (instancetype)init {
self = [super init];
if (self) {
}
return self;
}
Jadi apabila penyataan berikut dilaksanakan, mengapa self.lastName apabila kelas induk dimulakan memanggil penetap subkelas
SmithPerson *p1 = [[SmithPerson alloc] init];
大家讲道理2017-05-02 09:32:21
1. Subkelas menulis semula getter/setter
@interface SmithPerson : Person
@end
@implementation SmithPerson
- (void)setLastName:(NSString *)lastName {
[super setLastName:lastName];
}
@end
2,
self.lastName = @"abc";
//该方法等价于 [self setLastName:@"abc"];
//self 的类型为SmithPerson,所以会调用SmithPerson 类的 -setLastName: 方法