クラス変数の通常の 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]
動作します。を呼び出すと、インスタンス上で動作します。ClassA
classVar
[ClassASubclass someMethod]
ClassASubclass
オブジェクト (クラスまたはインスタンス) にアタッチされた任意の種類の変数を持つという考えは、Objective C に「留められた」機能のようなものです。メソッド。(ほとんど) 他のすべては、メソッドで実行できることの構文糖衣にすぎません。
メンバー変数に対してアクセス制御がサポートされていても、private / protected / public の概念は、Objective C とは少し異なります。メソッドに対してできる最善の方法は、それらを別のヘッダーで定義することです (メソッドを使用して両方を実装する場合、これはクラス変数とプロパティに適用されます)。