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

liv*_*v a 5 objective-c

(ARC已启用)

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

@property (nonatomic) NSUInteger cardValue; 
Run Code Online (Sandbox Code Playgroud)

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

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

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

    一)写_cardValueWarGameCard:导致编译器错误(我想有在Objective-C没有受保护的访问修饰符和变量是私有的)

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

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

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

Mar*_*ein 13

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

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

 - (void) setCardValue: (NSInteger) newValue
 {
      [super setValue: newValue];
      [self celebratePromotion];
 }
Run Code Online (Sandbox Code Playgroud)

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

  • `目标C没有受保护的继承.我不认为这是正确的.实例变量的默认修饰符将是@protected,可以在子类中使用.唯一应该做的是将实例声明放到标题中.但是在现代的Objective-C中,没有必要在头文件中声明实例变量(编译器可以帮助你并在.m文件中声明它们),因此你无法直接访问实例var.只需使用访问器即可.@MarkBernstein +1. (2认同)
  • 有实例变量的受保护继承,为true.但是没有受保护的方法继承,这是人们习惯于(比方说)C++所寻求的.因为有充分的理由永远不会避免使用裸实例变量,所以很容易忘记@protected存在! (2认同)