(已启用ARC)
假设我有一个类名BasicGameCard,它声明了以下属性:
@property (nonatomic) NSUInteger cardValue;
然后我创建了一个派生类WarGameCard:BasicGameCard。
WarGameCard以suit属性扩展,并希望使用继承的cardValue来表示其排名 问题:
如何在WarGameCard
类中使用/调用变量_cardValue
而不使用属性?
a)在_cardValue
中写WarGameCard
:导致编译错误(我猜没有
objective-c中的protected访问修饰符,变量是私有的)
b)不能使用self.cardValue
它会编译但会导致无限循环调用
设定器
c)尝试在WarGameCard
中撰写以下内容:@synthesize cardValue = _cardValue;
但是在调试时我会看到2个不同的变量,一个是超类,另一个是派生的
每个都有不同的价值
覆盖继承属性的正确方法是什么
答案 0 :(得分:13)
在您的子类中,使用继承的访问器cardValue
和setCardValue:
来获取和设置继承的值。您不需要覆盖该值;你只需要使用它。
一旦您的子类始终使用访问者,那么您可以根据需要覆盖访问者。例如
- (void) setCardValue: (NSInteger) newValue
{
[super setValue: newValue];
[self celebratePromotion];
}
你是对的:在Objective C中没有受保护的继承。但是现代Objective-C比C ++更广泛地使用访问器。实际上,在构造函数和析构函数以及(可以说是)访问器之外,您不应该直接触及实例变量。