Инициализация кластера класса
-
01-10-2019 - |
Вопрос
Мое приложение для iPhone имеет абстрактный класс WorksView. Это подкласс UIView. WorkingView будет в свою очередь иметь кучу бетонных подклассов. Два из них будут упростить просмотр и умножение.
Я пытаюсь написать метод, который создает новые экземпляры WorkeView. Этот метод должен иметь режим пропущенным и возвращать экземпляр соответствующего бетонного подкласса. За ответ на этот вопрос, Это то, что у меня сейчас:
+ (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 iniview. Призыв [Super initwithframe: кадр] Получает меня только на WorkingView, не вплоть до UIView. Я полагаю, что я мог бы создать инициативный метку: метод WorkeView, что в свою очередь вызывает initWithframe UIView INITWITHFRAME: - но это чувствует себя взлома.
Какой подходящий способ справиться с этим?
Решение
Если вы звоните [super initWithFrame:frame]
Из вашего подкласса временем выполнения поднимается на иерархию наследования, которую ищут класс, который реализует этот метод, начиная с супер. Если Super не реализует initWithFrame:
, время выполнения продолжит восхождение, пока он в конечном итоге не найдет и не вызывает реализацию по умолчанию в UIView.