Инициализация кластера классов

В моем приложении для iPhone есть абстрактный класс WorkingView. Это подкласс UIView. WorkingView, в свою очередь, будет иметь несколько конкретных подклассов. Два из них будут SimplifyView и MultiplyView.

Я пытаюсь написать метод, который создает новые экземпляры WorkingView. Этот метод должен иметь переданный режим и возвращать экземпляр соответствующего конкретного подкласса. Согласно ответу на этот вопрос, это то, что я имею до сих пор:

+ (id)newWorkingViewWithFrame:(CGRect)frame mode: (modeEnum) mode {
    WorkingView *ret;
    switch (mode) {
        case simplifyMode:
            ret = [[SimplifyView alloc]initWithFrame: frame];
            break;
        case multiplyMode:
            ret = [[MultiplyView alloc]initWithFrame: frame];
            break;
        // additional cases here
        default:
            return nil;
    }
    // more initialization here
    return ret;
}

Все идет нормально. Но здесь есть проблема. В методе init SimplifyView мне нужно запустить объект через метод init UIView. Вызов [super initWithFrame: frame] возвращает меня только к WorkingView, а не к UIView. Я полагаю, я мог бы создать initWithFrame: метод в WorkingView, который, в свою очередь, вызывает initWithFrame: метод UIView - но это кажется хакерским.

Каков подходящий способ справиться с этим?

1 ответ

Решение

Если вы позвоните [super initWithFrame:frame] из вашего подкласса среда выполнения поднимется по иерархии наследования в поисках класса, реализующего этот метод, начиная с super. Если супер не реализует initWithFrame:время выполнения будет расти, пока в конечном итоге не найдет и не вызовет реализацию по умолчанию в UIView.

Другие вопросы по тегам