У меня есть ряд объектов «policy», которые, как мне показалось, было бы удобно реализовать в виде методов класса для набора классов политики. Я определил протокол для этого и создал классы для соответствия (только один показан ниже)
@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?)
Моя точная проблема - когда я хочу вызвать метод, когда я беру один из объектов политики из массива:
id<Counter> counter = [[MyModel availableCounters] objectAtIndex: self.index];
return [counter countFor: self];
Я получаю предупреждение о выражении return - в нем говорится -countFor: не найдено в протоколе (поэтому предполагается, что это метод экземпляра, в котором я хочу вызвать метод класса). Однако, поскольку объекты в моем массиве являются экземплярами класса, они теперь похожи на методы экземпляров (или концептуально они должны быть).
Есть ли волшебный способ вызова методов класса? Или это просто плохая идея, и я должен просто создавать экземпляры своих объектов политики (а не использовать методы класса)?