6

(ARCが有効になっています)

次のプロパティを宣言したBasicGameCardというクラス名があるとします。

@property (nonatomic) NSUInteger cardValue; 

次に、派生クラスWarGameCard:BasicGameCardを作成します。

WarGameCardはsuitプロパティで拡張され、継承されたcardValueを使用してランクを表したいと考えています。質問:

  1. プロパティを使用せずにWarGameCardクラスで変数を使用/呼び出すにはどうすればよいですか?_cardValue

    a)書き込み:コンパイラエラーが発生します(objective-cには保護されたAccess修飾子がなく、変数はプライベートであると思います_cardValueWarGameCard

    b)使用できませんself.cardValueが、コンパイルされますが、セッターを呼び出す無限ループが発生します

    c)次のように書き込もうとしましたWarGameCard@synthesize cardValue = _cardValue; しかし、デバッグ時に、スーパークラスと派生変数の2つの異なる変数がそれぞれ異なる値で表示されます

  2. 継承されたプロパティをオーバーライドする正しい方法は何ですか

4

1 に答える 1

13

サブクラスでは、継承されたアクセサーcardValueを使用して、継承setCardValue:された値を取得および設定します。値をオーバーライドする必要はありません。あなたはそれを使う必要があります。

サブクラスが一貫してアクセサーを使用すると、必要に応じてアクセサーをオーバーライドできます。例えば

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

その通りです。Objective C には、保護された継承はありません。しかし、最新の Objective-C では、C++ よりもはるかに広範囲にアクセサーが使用されています。実際、コンストラクタとデストラクタ、および (ほぼ間違いなく) アクセサの外側では、インスタンス変数に直接触れてはいけません。

于 2013-02-25T00:21:23.253 に答える