2012-04-13 71 views
1

这是我的第一篇文章;这个网站一直是非常宝贵的资源。在Objective-C中继承访问器

我对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 

可写,但现在,如果我继承这个类的派生类中不再有设置访问器方法(setSpeed在我的情况)。我是否需要再次合成?看起来这样会打败继承的目的。我知道我可以直接修改实例变量(_speed = 10;),而不是。我相信我的理解有问题。谢谢!

// Example 
@interface Ship : Vehicle 
@end 

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

我猜我问的是我如何继承私有@interface someName()类.. – Patrick 2012-04-13 15:44:24

+1

我猜测你可以通过一个仅用于派生类的头来共享私有接口包括。 (我自己没有尝试过这个,因此评论而不是答案。) – 2012-04-13 15:48:50

回答

7

但是现在,如果我继承这个类,派生类不再具有set存取方法(setSpeed在我的情况下)。

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

  • 把类扩展(在被导入到.m车辆和它的子类单独的头文件中@interface Vehicle() .... @end位(或使用类)
  • 重新声明读/写性能在一类扩展为子类。为了避免警告,在子类的实现中使用@dynamic speed
+0

啊,谢谢,我隐约记得在某个时候阅读@dynamic。这听起来很正确,因为你和Marcelo在同一条轨道上。额外的++点为多个解决方案。当我回到家时,我会尝试它,并将其标记为正确的。任何方式与协议做到这一点?赎回似乎很乏味,但我可以忍受。再次感谢。 – Patrick 2012-04-13 19:40:57

+0

更新:测试以上,效果很好。我意识到两种解决方案实际上是相同的,额外的头文件只需保存复制/粘贴该块即可。还指出,如果我使用合成而不是动态,它不会发出警告,功能也不会改变。 – Patrick 2012-04-13 23:38:20

+0

@Patrick:如果使用'@ synthesize',它会生成新的访问器,并且可能为子类创建一个新的ivar,所以使用'@ dynamic'。 – JeremyP 2012-04-16 08:45:01

4

由于没有'受保护的'方法,所以您需要在匿名类别中创建一个私有共享标头。然后你的原始实现和你的派生类都包含这个头部来访问这个'私人'的东西。

+0

那么说,我想这种方法没有头文件的命名约定。我使用BaseClassNamePrivate,但这是微不足道的。 – Patrick 2012-04-17 18:58:48