Objective-C使用继承变量&重写继承的属性

时间:2013-02-25 00:09:24

标签: objective-c

(已启用ARC)

假设我有一个类名BasicGameCard,它声明了以下属性:

@property (nonatomic) NSUInteger cardValue; 

然后我创建了一个派生类WarGameCard:BasicGameCard。

WarGameCard以suit属性扩展,并希望使用继承的cardValue来表示其排名 问题:

  1. 如何在WarGameCard类中使用/调用变量_cardValue而不使用属性?

    a)在_cardValue中写WarGameCard:导致编译错误(我猜没有   objective-c中的protected访问修饰符,变量是私有的)

    b)不能使用self.cardValue它会编译但会导致无限循环调用   设定器

    c)尝试在WarGameCard中撰写以下内容:@synthesize cardValue = _cardValue;   但是在调试时我会看到2个不同的变量,一个是超类,另一个是派生的   每个都有不同的价值

  2. 覆盖继承属性的正确方法是什么

1 个答案:

答案 0 :(得分:13)

在您的子类中,使用继承的访问器cardValuesetCardValue:来获取和设置继承的值。您不需要覆盖该值;你只需要使用它。

一旦您的子类始终使用访问者,那么您可以根据需要覆盖访问者。例如

 - (void) setCardValue: (NSInteger) newValue
 {
      [super setValue: newValue];
      [self celebratePromotion];
 }

你是对的:在Objective C中没有受保护的继承。但是现代Objective-C比C ++更广泛地使用访问器。实际上,在构造函数和析构函数以及(可以说是)访问器之外,您不应该直接触及实例变量。