Objective-C: получить список подклассов из суперкласса

В Objective-C есть способ спросить класс, есть ли какие-либо реализации подкласса.

У меня есть базовый класс, который имеет несколько подклассов. Я хотел бы перебрать все подклассы и выполнить селектор классов для каждого из них.

Править :

У меня есть набор классов, которые могут обрабатывать определенные типы данных. Каждый из процессоров является подклассом базового класса, который предоставляет методы, необходимые каждому процессору.

Каждый класс знает, какие данные он может обрабатывать, и некоторые классы могут обрабатывать определенные типы данных лучше, чем другие.

Я хотел бы иметь метод класса для каждого класса, который предоставил бы ответ фабричному классу, который говорит: «Да, я могу обработать эти данные», и дает представление о том, насколько хорошо он может их обрабатывать.

Затем фабрика будет принимать решение о том, какой класс создать, на основе того, какой класс говорит, что он может лучше всего обрабатывать данные.

Я также нашел этот вопрос из 2009 года (я искал, прежде чем опубликовать его, но ничего не нашел) Обнаружение подклассов данного класса в Obj-C .

Правка 2 :

Метод + (void) load выглядит идеальным решением для того, что я ищу. Итак, теперь у меня есть следующее:

+ (void)registerSubclass:(Class)subclass {
    NSLog(@"Registered %@", subclass);
}

В моем базовом классе это мои подпрограммы.

+(void)load {
    [BaseSwitch registerSubclass:[self class]];
}

Теперь отображается сообщение отладки для каждого из подклассов.

Мой следующий вопрос (вероятно, глупый): как мне сохранить классы, которые регистрируются в методе registerSubclass. Есть ли способ иметь переменную класса, которую я могу прочитать позже?

Редактировать 3 :

Нашел здесь пример кода Простой расширяемый HTTP-сервер в Какао

Который оставил меня с следующее, после всего сказанного и сделанного, кажется довольно простым. Но я подумал, что помещу его сюда для дальнейшего использования.

@implementation BaseSwitch

static NSMutableArray *registeredSubclasses;

+ (void)registerSubclass:(Class)subclass {
    if (registeredSubclasses == nil) {
        registeredSubclasses = [[NSMutableArray alloc] init];
    }

    [registeredSubclasses addObject:subclass];

    NSLog(@"Registered %@", subclass);
}

+ (void)logSubclasses {
    for (int i = 0; i < [registeredSubclasses count]; i++) {
        NSLog(@"%@", [registeredSubclasses objectAtIndex:i]);
    }
}

@end

Спасибо за все предложения, я оставлю вопрос без ответа еще на пару дней, если возникнет что-то еще.

11
задан Community 23 May 2017 в 12:18
поделиться