ポリシー クラスのセットでクラス メソッドとして実装すると便利だと思われる一連の「ポリシー」オブジェクトがあります。このためのプロトコルを指定し、準拠するクラスを作成しました (以下に示すのは 1 つだけです)。
@protocol Counter
+(NSInteger) countFor: (Model *)model;
@end
@interface CurrentListCounter : NSObject <Counter>
+(NSInteger) countFor: (Model *)model;
@end
次に、このプロトコルに準拠するクラスの配列があります (CurrentListCounter のように)
+(NSArray *) availableCounters {
return [[[NSArray alloc] initWithObjects: [CurrentListCounter class], [AllListsCounter class], nil] autorelease];
}
オブジェクトのようなクラスをどのように使用しているかに注意してください (これは私の問題かもしれません。Smalltalk では、クラスは他のすべてのオブジェクトと同じようにオブジェクトです。Objective-C にあるかどうかはわかりません)。
私の正確な問題は、配列からポリシー オブジェクトの 1 つを取得するときにメソッドを呼び出したい場合です。
id<Counter> counter = [[MyModel availableCounters] objectAtIndex: self.index];
return [counter countFor: self];
return ステートメントで警告が表示されます - -countFor: not found in protocol と表示されます (そのため、クラス メソッドを呼び出したいインスタンス メソッドを想定しています)。ただし、配列内のオブジェクトはクラスのインスタンスであるため、インスタンス メソッドのようになりました (概念的にはそうあるべきです)。
クラスメソッドを呼び出す魔法の方法はありますか? それとも、これは単に悪い考えであり、ポリシー オブジェクトのインスタンスを作成するだけでよいのでしょうか (クラス メソッドは使用しないでください)。