|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Объединение методов с одинаковой реализацией
Все привет. Подскажите пожалуйста, как правильней переделать? Никогда не связывался с Интерфейсами. Хотя в моем случае понимаю не совсем даже интерфейсы нужны.
В приложении есть разные окна, которые могут сменять друг друга (одновременно существовать не может несколько окон). Например, окно с приветствием - класс WelcomeScreen, настройками - класс SettingsScreen, информацией о профиле - AccountScreen и т.д. Сейчас в каждом из них есть методы:
Реализация show() и hide() одинакова во всех окнах - следовательно их можно вынести в некий общий класс. Реализация остальных методов различается для разных окон. Как понимаю, можно создать интерфейс, например IWindow - в котором будут перечислены все эти методы. И создать некий шаблонный класс Window, который будет имплементить все эти методы - show() и hide() с реализацией. А остальные методы оставить пустыми - классы наследники будут делать override. package { public interface IWindow { function show():void; function hide():void; function resize():void; function changeLang():void; function destroy():void; } } package { import com.greensock.TweenMax; import com.greensock.easing.Linear; import flash.display.MovieClip; import flash.events.Event; public class Window extends MovieClip implements IWindow { public static const HIDE_COMPLETE:String = 'hideComplete'; public function show():void { TweenMax.to(this, 0.3, {alpha: 1, ease:Linear.easeNone}); } public function hide():void { TweenMax.to(this, 0.5, {alpha: 0, ease:Linear.easeNone, onComplete:onHideTweenFinished}); } private function onHideTweenFinished():void { dispatchEvent(new Event(HIDE_COMPLETE)); } public function changeLang():void {} public function resize():void {} public function destroy():void {} } } Как все таки правильней будет? Либо же вариант 2. В классе Window описать только классы с реализацией - show() и hide(). В интерфейсе IWindow обозначить остальные методы (они будут реализовываться в каждом окне по-своему). И создать некий класс WindowManager, в котором будет метод добавления окна addWindow(win:IWindow) - этот класс будет руководить парадом появления/скрытия окон. И в итоге каждое отдельное окно должно будет наследоваться от Window. А чтобы мог добавляться в WindowManager - должен имплементить IWindow. Или так лучше? Заранее спасибо за помощь в вопросе!
__________________
кто не отвечает, того garbage collector забирает |
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
вариант 3 — методы show() и hide() реализованы в менеджере окон.
__________________
Reality.getBounds(this); |
|
|||||
Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 479
|
djken, а что мешает унаследовать все эти окна от одного базового класса, и прописать там эти методы как абстрактные? В этом случае и ты, и сторонний разработчик не сможете уклониться от реализации всех методов в наследниках.
__________________
Не сломано - не чини! |
|
|||||
Разве во флеше есть абстрактные методы?
__________________
Я заклинаю вас действовать иначе. |
|
|||||
Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 479
|
__________________
Не сломано - не чини! |
|
|||||
Wolsh, да, в принципе в моем случае можно так сделать. Но что, если за появление/скрытие должно отвечать само окно? (сначала внтури каждого окна всплывает логотип как-то особенно, потом остальные элементы) - в этом случае WindowManager не обязан знать ничего о внутреннем поведении окна при открытии/закрытии, и следовательно, мне нужно реализовать эти методы внутри класса Window - как в этой ситуации?
Appleman в AS3 нет Абстрактных классов и методов. Если только не реализовать их самом по такому принципу, например https://joshblog.net/2007/08/19/enfo...ctionscript-3/
__________________
кто не отвечает, того garbage collector забирает |
|
|||||
метод changeLang(lang:String) вообще лучше не на уровне окна делать. Я бы лучше сделал наследники или даже обертки для TextField и там слушал событие смены языка, и после события менял текст в них. Независимо от окон вообще.
Метод resize реализовать одинаково для всех окон, в базовом классе. Остальное пофиг. Если все-таки нужно чтобы при вызове что-то предупреждало разработчика о том, что метод по-любому надо перезаписать, то Appleman предложил хороший вариант. Реальной абстракции в ас3 все равно нет и компилятор не пожалуется на отсутствие оверрайда
__________________
Ко мне можно и нужно обращаться на ты) |
|
|||||
Это костыль какой-то.
__________________
Я заклинаю вас действовать иначе. |
Часовой пояс GMT +4, время: 07:29. |
|
« Предыдущая тема | Следующая тема » |
|
|