1

这是我的第一篇文章; 这个网站是一个非常宝贵的资源。

我对objective-c还很陌生,所以请多多包涵。

所以我有一个基类,其中包含一些我想要“私有”的属性,所以我将它们设为只读。需要明确的是,我不希望它们在外部是可变的,但我确实不想在这个类中使用“set”访问器。所以...

// .h file
@interface Vehicle
@property (nonatomic, readonly) int speed;
@end

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

// .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

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

// Example
@interface Ship : Vehicle
@end

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

2 回答 2

7

但是现在如果我继承这个类,派生类不再有 set 访问器方法(在我的例子中是 setSpeed)。

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

  • 将类扩展名(该@interface Vehicle() .... @end位放在一个单独的头文件中,该文件被导入.mfor Vehicle 及其子类(或使用类别)
  • 在子类的类扩展中重新声明读/写属性。为避免出现警告,@dynamic speed请在子类的实现中使用。
于 2012-04-13T15:53:50.227 回答
4

由于没有“受保护”方法之类的东西,因此您需要在匿名类别所在的位置创建一个私有共享标头。然后,您的原始实现和派生类都包含此标头以访问此“私有”内容。

于 2012-04-13T15:47:12.460 回答