Показать сообщение отдельно
Старый 28.03.2019, 04:34
djken вне форума Посмотреть профиль Отправить личное сообщение для djken Посетить домашнюю страницу djken Найти все сообщения от djken
  № 1  
Ответить с цитированием
djken
 
Аватар для djken

Регистрация: May 2010
Адрес: Краснодар
Сообщений: 182
Отправить сообщение для djken с помощью ICQ Отправить сообщение для djken с помощью Skype™
Question Объединение методов с одинаковой реализацией

Все привет. Подскажите пожалуйста, как правильней переделать? Никогда не связывался с Интерфейсами. Хотя в моем случае понимаю не совсем даже интерфейсы нужны.

В приложении есть разные окна, которые могут сменять друг друга (одновременно существовать не может несколько окон). Например, окно с приветствием - класс WelcomeScreen, настройками - класс SettingsScreen, информацией о профиле - AccountScreen и т.д.
Сейчас в каждом из них есть методы:
  • show() // плавно показать окно
  • hide() // плавно скрыть окно
  • changeLang(lang:String) // сменить язык
  • resize() // ресайз объектов в окне
  • destroy() // ликвидировать

Реализация show() и hide() одинакова во всех окнах - следовательно их можно вынести в некий общий класс. Реализация остальных методов различается для разных окон.

Как понимаю, можно создать интерфейс, например IWindow - в котором будут перечислены все эти методы.
И создать некий шаблонный класс Window, который будет имплементить все эти методы - show() и hide() с реализацией. А остальные методы оставить пустыми - классы наследники будут делать override.

Код AS3:
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 {}
	}
}
Теперь можно создавать любое окно наследуясь от Window
Код AS3:
public class SettingsScreen extends Window
. Но мне эта реализация не совсем нравится. Я единственный разработчик в приложении - и поэтому знаю/помню что в каждом окне мне нужно делать override пустых методов. А если, допустим, за приложение взялся еще кто-нибудь дорабатывать, хочет добавить новое окно - он вряд ли поймет, что ему нужно перезаписывать эти методы.

Как все таки правильней будет?

Либо же вариант 2. В классе Window описать только классы с реализацией - show() и hide(). В интерфейсе IWindow обозначить остальные методы (они будут реализовываться в каждом окне по-своему). И создать некий класс WindowManager, в котором будет метод добавления окна addWindow(win:IWindow) - этот класс будет руководить парадом появления/скрытия окон.
И в итоге каждое отдельное окно должно будет наследоваться от Window. А чтобы мог добавляться в WindowManager - должен имплементить IWindow.

Или так лучше?

Заранее спасибо за помощь в вопросе!
__________________
кто не отвечает, того garbage collector забирает