Скажем, у меня есть два класса, BulbDevice
и FanDevice
, оба являются подклассами Device
и имеют сигнатуру метода, подобную этой:
+ (BOOL)isMyId:(NSInteger)someId;
Если бы я хотел создать класс, я мог бы проверить его:
if ([BulbDevice isMyId:someId]) {
Device *dev = [BulbDevice alloc] initWithId:someId];
}
Но то, что я действительно хочу, это создать фабричный метод внутри фабричного класса, с минимальной суетой при добавлении нового устройства:
+ (Device)createDevice:(NSInteger)someId {
// say I have an array registered
NSArray *arr = @[[BulbDevice class], [FanDevice class]];
// Loop through it.
Device *device;
for (Class *c in arr) {
// The idea is kind of like this but I'm not sure how to make it work
if ([c isMyId]) {
device = [[c alloc] init];
}
}
}
Идея состоит в том, что мне нужно только обновить arr
в заводском методе. Поэтому я думаю, что хорошо иметь что-то подобное. Но я не уверен, как заставить это работать.
EDIT
Я вынул звездочку, но она не сработает:
for (Class c in arr) {
// Now I want to access the isMyId which is a static method,
// but I how do I cast to that class? I mean not an object of the class, but to that class itself.
if ([(Device)c isMyId:]) {
}
}
Но мне все еще нужен способ доступа к этому методу класса. Ошибка говорит Used type 'Device' where arithmetic or pointer type is required
, и даже если она работает, я хочу получить доступ к методу класса, а не посылать сообщение объекту.
Или вместо этого я должен хранить NSString
в массиве? Но трудно также найти способ доступа к методу класса.