Вопрос заключается не только в заголовке, но и в том, «как мне этого добиться, не пытаясь втиснуть дизайн Java / Flash в программу Objective C (iPhone)».
У меня есть 6 представлений, которые расширяют UIView, все эти представления имеют различное поведение, но используют определенные методы, такие как -(void) update
и -(void) changeState:(NSInteger)state
.
viewController, задачей которого является обновление, создание и отображение этих представлений, имеет блок переключателей для этого. Так что switch (4) {...} создает экземпляр UIView4, но, поскольку мне нужна ссылка на текущий экземпляр (для выполнения update
и changeState:
), у меня есть свойство UIView в ViewController, называемое self.currentView. Поскольку созданный экземпляр UIView4 расширяет UIView, я могу легко перейти на [self.currentView addSubview:UIView4instance]
и затем выпустить экземпляр UIView4.
Теперь, как я вызову метод [UIView4instance update]
в представлении? или [UIView5instance changeState]
и т. д. и т. д.
Поскольку я добавил его в self.currentView
типа UIView, у него больше нет оснований полагать, что у него есть метод update
или changeState:
, то есть я не могу перебирать представления и отправлять им эти сообщения.
Этот подход порождает массу других проблем, мне нужно было бы тестировать и печатать свои представления каждый раз, когда мне нужно было выполнить над ними какие-либо операции.
Если бы я делал что-то подобное подходу Composite Pattern, скажем, в Java. Я бы написал интерфейс, который бы реализовывал все виды (UIView1, UIview2 .... UIViewN). Или, может быть, абстрактный класс, от которого все представления унаследовали методы changeState:
и update
.
Таким образом, я мог бы self.currentView
просто знать, что я добавляю объекты в ваше представление, и все они соответствуют этим методам.
Два моих решения Objective-C, о которых я могу подумать:
делать это с делегированием или категориями, но это кажется излишним во всех отношениях: /
Думаю, я мог бы также расширить UIView, а затем снова расширить свой класс, расширяя UIView, но, вероятно, есть причина, по которой Objective-C не поддерживает напрямую абстрактные классы ...
Надеюсь, кто-то может указать мне правильное направление в отношении этих вопросов.
Спасибо:)