Инициализация кластера классов - PullRequest
1 голос
/ 28 августа 2010

В моем приложении для 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 Ответ

0 голосов
/ 28 августа 2010

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

...