1

この SA の質問 ( Objective C Static Class Level variables ) に対する上位投票の回答は、私の質問の概要をよく説明していますが、もう 1 つの基準を追加したいと思います。

問題の説明

  1. ClassA に ClassB クラス変数を持たせたいとします。
  2. プログラミング言語として Objective-C を使用しています。
  3. Objective-C は、C++ のようにクラス変数をサポートしていません。

  4. サブクラス ClassASub から ClassA のクラス変数にアクセスしたい

またはさらに良い

4a. ClassA のメソッドで、ClassASub でオーバーライドされたクラス変数にそのままアクセスできるようにしたい

何か案は?それとも、これは Objective-C を 1 段階曲げすぎているだけですか?

4

1 に答える 1

1

クラス変数の通常の getter メソッドを作成するだけで、サブクラスでオーバーライドできます。メソッドを介してアクセスすることを忘れないでください。

static SomeClass *gClassVar;

@implementation ClassA

+ (SomeClass *)classVar {
    if (!gClassVar)
        gClassVar = ...;
    return gClassVar;
}

+ (...)someMethod {
    [[self classVar] doSomething];
}

@end

それで、

static SomeClass *gClassVar;

@implementation ClassASubclass

+ (SomeClass *)classVar {
    if (!gClassVar)
        gClassVar = ...;
    return gClassVar;
}

@end

したがって、 を呼び出すと、 のインスタンスで[ClassA someMethod]動作します。を呼び出すと、インスタンス上で動作します。ClassAclassVar[ClassASubclass someMethod]ClassASubclass

オブジェクト (クラスまたはインスタンス) にアタッチされた任意の種類の変数を持つという考えは、Objective C に「留められた」機能のようなものです。メソッド。(ほとんど) 他のすべては、メソッドで実行できることの構文糖衣にすぎません。

メンバー変数に対してアクセス制御がサポートされていても、private / protected / public の概念は、Objective C とは少し異なります。メソッドに対してできる最善の方法は、それらを別のヘッダーで定義することです (メソッドを使用して両方を実装する場合、これはクラス変数とプロパティに適用されます)。

于 2011-09-07T18:56:35.143 に答える