6

(启用 ARC)

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

@property (nonatomic) NSUInteger cardValue; 

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

WarGameCard 扩展了一个花色属性,并希望使用继承的 cardValue 来表示它的等级问题:

  1. 我如何在不使用属性的情况下在WarGameCard类中使用/调用变量?_cardValue

    a)写入:_cardValue导致WarGameCard编译器错误(我猜objective-c中没有受保护的访问修饰符并且变量是私有的)

    b) 不能使用self.cardValue它会编译,但会导致调用 setter 的无限循环

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

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

4

1 回答 1

13

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

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

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

你是对的:在 Objective C 中没有受保护的继承。但是现代的 Objective-C 使用访问器的范围远远超过 C++。事实上,在构造函数和析构函数以及(可以说)访问器之外,你永远不应该直接接触实例变量。

于 2013-02-25T00:21:23.253 回答