Задача:
Есть класс ViewA и отнаследованный от него ViewB с 2-мя designated initializer'ми каждый. У обоих есть метод configure, вызываемый из каждого initializer'а:
- (instancetype)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
[self configure];
}
return self;
}
//...
- (void)configure {
// Create some subviews etc
}
Суть проблемы:
- Если мы вызываем -configure из init'ов ViewA и ViewB, то в init'е ViewA configure вызовется ViewB'шный. Вызов [super configure] внутри -configure при этом не спасает (-configure ViewA вызовется несколько раз).
- Проверки на -isMemberOfClass при вызове -configure из init'ов работают, но добавляют кучу лишнего кода
- Проверки на -isMemberOfClass в -configure не работают совсем.
- При этом в нашем приложении мы хотим использовать как VIewB, так и ViewA, поэтому не вызывать -configure из init'а ViewA не вариант.
Конечно, есть рабочее и простое решение — вызывать -configure вручную после создания объекта:
ViewA *view = [[ViewA alloc] initWithFrame:someFrame];
[view configure];
Но мне такой подход не кажется правильным. И у меня есть чувство, что я что-то упускаю.