Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 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 забирает

Старый 28.03.2019, 09:08
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 2  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
вариант 3 — методы show() и hide() реализованы в менеджере окон.
__________________
Reality.getBounds(this);

Старый 28.03.2019, 10:03
Appleman вне форума Посмотреть профиль Отправить личное сообщение для Appleman Найти все сообщения от Appleman
  № 3  
Ответить с цитированием
Appleman
 
Аватар для Appleman

Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 479
djken, а что мешает унаследовать все эти окна от одного базового класса, и прописать там эти методы как абстрактные? В этом случае и ты, и сторонний разработчик не сможете уклониться от реализации всех методов в наследниках.
__________________
Не сломано - не чини!

Старый 28.03.2019, 11:10
Bletraut вне форума Посмотреть профиль Отправить личное сообщение для Bletraut Найти все сообщения от Bletraut
  № 4  
Ответить с цитированием
Bletraut
 
Аватар для Bletraut

Регистрация: Mar 2013
Адрес: Вне пространства.
Сообщений: 566
Отправить сообщение для Bletraut с помощью ICQ Отправить сообщение для Bletraut с помощью Skype™
Цитата:
Сообщение от Appleman Посмотреть сообщение
djken, а что мешает унаследовать все эти окна от одного базового класса, и прописать там эти методы как абстрактные? В этом случае и ты, и сторонний разработчик не сможете уклониться от реализации всех методов в наследниках.
Разве во флеше есть абстрактные методы?
__________________
Я заклинаю вас действовать иначе.

Старый 28.03.2019, 14:42
Appleman вне форума Посмотреть профиль Отправить личное сообщение для Appleman Найти все сообщения от Appleman
  № 5  
Ответить с цитированием
Appleman
 
Аватар для Appleman

Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 479
Цитата:
Сообщение от Bletraut Посмотреть сообщение
Разве во флеше есть абстрактные методы?
Код AS3:
public function someAbstractMethod() : void
{
     throw ("Это абстрактный класс, должен быть реализован в наследниках!");
}
__________________
Не сломано - не чини!

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

Регистрация: May 2010
Адрес: Краснодар
Сообщений: 182
Отправить сообщение для djken с помощью ICQ Отправить сообщение для djken с помощью Skype™
Wolsh, да, в принципе в моем случае можно так сделать. Но что, если за появление/скрытие должно отвечать само окно? (сначала внтури каждого окна всплывает логотип как-то особенно, потом остальные элементы) - в этом случае WindowManager не обязан знать ничего о внутреннем поведении окна при открытии/закрытии, и следовательно, мне нужно реализовать эти методы внутри класса Window - как в этой ситуации?

Appleman в AS3 нет Абстрактных классов и методов. Если только не реализовать их самом по такому принципу, например https://joshblog.net/2007/08/19/enfo...ctionscript-3/
__________________
кто не отвечает, того garbage collector забирает

Старый 28.03.2019, 15:04
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 7  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
метод changeLang(lang:String) вообще лучше не на уровне окна делать. Я бы лучше сделал наследники или даже обертки для TextField и там слушал событие смены языка, и после события менял текст в них. Независимо от окон вообще.

Метод resize реализовать одинаково для всех окон, в базовом классе. Остальное пофиг.
Если все-таки нужно чтобы при вызове что-то предупреждало разработчика о том, что метод по-любому надо перезаписать, то Appleman предложил хороший вариант. Реальной абстракции в ас3 все равно нет и компилятор не пожалуется на отсутствие оверрайда
__________________
Ко мне можно и нужно обращаться на ты)

Старый 29.03.2019, 17:55
Bletraut вне форума Посмотреть профиль Отправить личное сообщение для Bletraut Найти все сообщения от Bletraut
  № 8  
Ответить с цитированием
Bletraut
 
Аватар для Bletraut

Регистрация: Mar 2013
Адрес: Вне пространства.
Сообщений: 566
Отправить сообщение для Bletraut с помощью ICQ Отправить сообщение для Bletraut с помощью Skype™
Цитата:
Сообщение от Appleman Посмотреть сообщение
Код AS3:
public function someAbstractMethod() : void
{
     throw ("Это абстрактный класс, должен быть реализован в наследниках!");
}
Это костыль какой-то.
__________________
Я заклинаю вас действовать иначе.

Старый 29.03.2019, 21:39
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 9  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
Сообщение от Bletraut Посмотреть сообщение
Это костыль какой-то.
За неимением лучшего, пойдет. Много раз встречал такое в as3
__________________
Ко мне можно и нужно обращаться на ты)

Старый 30.03.2019, 00:13
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 10  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Цитата:
Сообщение от Wolsh Посмотреть сообщение
вариант 3 — методы show() и hide() реализованы в менеджере окон.
Полностью согласен
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

Создать новую тему Ответ Часовой пояс GMT +4, время: 19:31.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 19:31.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.