|
|
|||||
Корректный оверрайд
Добрый день, нужна консультация.
Есть классик и его наследник. В наследнике оверрайдится функция обработчика. Насколько корректно такое переопределение? Какие минусы? package { import flash.display.Sprite; import flash.events.Event; public class Main extends Sprite { public function Main():void { if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); } private function init(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, init); var _customPanel:CustomPanel = new CustomPanel(); addChild(_customPanel); _customPanel.dispatchEvent(new Event(Panel.TEST_EVENT)); } } } package { import flash.display.Sprite; import flash.events.Event; public class Panel extends Sprite { public static const TEST_EVENT:String = "TestEvent"; public function Panel() { addEventListener(Event.ADDED_TO_STAGE, init, false, 0, true); } private function init(e:Event):void { removeEventListener(Event.ADDED_TO_STAGE, init); addEventListener(Panel.TEST_EVENT, onTestEvent, false, 0, true); } protected function onTestEvent(event:Event):void { trace("Panel::TEST "); } } } |
|
|||||
Et cetera
Регистрация: Sep 2002
Сообщений: 30,784
|
Непонятно, зачем тут события.
|
|
|||||
Это абстрактный пример, в реальном проекте необходим диспатч и нет возможности вызвать метод на прямую.
|
|
|||||
буду краток
модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
|
Не вижу минусов. Нормальный подход.
Например для каждой формы, наследника, есть свой кастомный обработчик onOk и onCancel.
__________________
Отряд Котовскага Последний раз редактировалось Котяра; 17.03.2011 в 16:31. |
|
|||||
Et cetera
Регистрация: Sep 2002
Сообщений: 30,784
|
Переписывайте проект тогда.
Сам по себе оверрайд не криминал, но вот использование подобным образом событий — клиника. |
|
|||||
В проекте используется ЭвентМенеджер, все события диспатчатся через него.
|
|
|||||
Et cetera
Регистрация: Sep 2002
Сообщений: 30,784
|
Тем более переписывать
|
|
|||||
Котяра, спасибо за ответ.
Хотелось бы уточнить на сколько корректен такой вариант: На это событие нужно подписываться в каждом наследнике, какой подход более правильный? |
|
|||||
Modus ponens
|
Я стараюсь писать так, чтобы классы не реализовывали свою собственную логику через события, а только сообщали о том, что в них происходит таким образом. И вообще как-то стараюсь избегать объявлять слушателей protected. Хотя в некоторых местах это практикуется, особенно если GUI классы неимоверно разростаются, и их по нескольку раз наследуют чтобы как-то заменить partial class (из C#). С другой стороны - иногда это неизбежно, например когда нужно использовать всякие лоадеры и т.п. Но, я думаю, что если нужно переписать обработчик событий какого-то внутреннего таймера или лоадера - лучше из оригинального обработчика вызвать какой-то метод, и в этом методе описать изменяющуюся часть, и уже его переопределять если нужно. Просто вы не знаете (и не должны знать, а может быть и не можете), когда и кто и зачем добавляет или удаляет этого слушателя - может потом боком выйти, если вы этого слушателя невовремя удалите, или наоборот не удалите.
__________________
Hell is the possibility of sanity |
|
|||||
wvxvw, спасибо!
|
Часовой пояс GMT +4, время: 18:21. |
|
« Предыдущая тема | Следующая тема » |
Опции темы | |
Опции просмотра | |
|
|