在Objective-C中继承访问器

Pat*_*ick 1 setter inheritance objective-c accessor readonly

这是我的第一篇文章; 这个网站一直是宝贵的资源.

我对Objective-c相当新,所以请耐心等待.

所以我有一个基类,有一些我希望"私有"的属性,所以我把它们做成只读.要清楚,我不希望它们在外部是可变的,但我不想在这个类中使用'set'访问器.所以...

// .h file
@interface Vehicle
@property (nonatomic, readonly) int speed;
@end
Run Code Online (Sandbox Code Playgroud)

此外,我在类别接口块中重复了属性声明,以使访问器在此类中可写

// .m file
//Private properties and methods
@interface Vehicle()
@property (nonatomic, readwrite) int speed;
@end

@implementation
@synthesize speed = _speed;
- (void) someMethod {
    [self setSpeed:10]; // Works fine
}

@end
Run Code Online (Sandbox Code Playgroud)

但是现在如果我继承这个类,派生类就不再具有set accessor方法(在我的例子中是setSpeed).我需要再次合成吗?似乎这样会破坏继承的目的.我知道我可以直接修改实例变量(_speed = 10;)但不愿意.我确信我的理解有问题.谢谢!

// Example
@interface Ship : Vehicle
@end

@implementation
- (void) someOtherMethod {
    [self setSpeed: 2]; // DOES NOT WORK, would like it to
}
@end
Run Code Online (Sandbox Code Playgroud)

Jer*_*myP 7

但是现在如果我继承这个类,派生类就不再具有set accessor方法(在我的例子中是setSpeed).

实际上,它确实有set访问器,只是编译器不知道它.你有一个选择:

  • 将类扩展(@interface Vehicle() .... @end位于单独的头文件中的位导入到.mfor Vehicle及其子类(或使用类别)中
  • 重新声明子类的类扩展中的读/写属性.要避免警告,请@dynamic speed在子类的实现中使用.