![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Цитата:
Просто не понимаю. Если не затруднит, объясните на примере. Спасибо.
__________________
Тут мужик танцует и поёт про флэш |
|
|||||
|
Пример есть прямо в хелпе, вроде все понятно сразу.
package { import flash.events.Event; import flash.display.Sprite; public class IEventDispatcherExample extends Sprite { public function IEventDispatcherExample() { var decorDispatcher:DecoratedDispatcher = new DecoratedDispatcher(); decorDispatcher.addEventListener("doSomething", didSomething); decorDispatcher.dispatchEvent(new Event("doSomething")); } public function didSomething(evt:Event):void { trace(">> didSomething"); } } } import flash.events.IEventDispatcher; import flash.events.EventDispatcher; import flash.events.Event; class DecoratedDispatcher implements IEventDispatcher { private var dispatcher:EventDispatcher; public function DecoratedDispatcher() { dispatcher = new EventDispatcher(this); } public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void{ dispatcher.addEventListener(type, listener, useCapture, priority); } public function dispatchEvent(evt:Event):Boolean{ return dispatcher.dispatchEvent(evt); } public function hasEventListener(type:String):Boolean{ return dispatcher.hasEventListener(type); } public function removeEventListener(type:String, listener:Function, useCapture:Boolean = false):void{ dispatcher.removeEventListener(type, listener, useCapture); } public function willTrigger(type:String):Boolean { return dispatcher.willTrigger(type); } }
__________________
Чтобы доказать, что вы не робот, причините вред другому человеку. |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Допустим тебе надо чтобы некий класс рассылал события "от своего имени", но при этом ты не можешь наследовать его от EventDispatcher (т.к. наследуешь от другого). Однако обеспечить функционал ты можешь агрегированием (композицией), заведя в этом классе встроенный объект EventDispatcher. Загвоздка только в том, что если рассылать события через него, то target у события будет ссылкой на этот объект EventDispatcher, а не на агрегат. Поскольку речь идет не столько о дисплейных объектах, то получить ссылку на сам агрегат будет затруднительно и потребует новых геттеров или особого класса события - target.parent тут не поможет. Вот для этого target и переобъявляется (хехе ну и слово). Однако нам ведь нужна уверенность, что этот новый таргет сможет полноценно прикинуться EventDispatcher - на него ведь будут вешать листенеры и т.п. Значит он обязан имплементить интерфейс IEventDispatcher.
Пример: package { import flash.events.Event; import flash.events.EventDispatcher; import flash.events.IEventDispatcher; import flash.events.TimerEvent; import flash.utils.Timer; public class IEDClass implements IEventDispatcher { private var _dispatcher:EventDispatcher; private var _timer:Timer = new Timer(500); public function IEDClass() { _dispatcher = new EventDispatcher(this); _timer.addEventListener(TimerEvent.TIMER, onTimer); _timer.start(); } private function onTimer(event:TimerEvent):void { _dispatcher.dispatchEvent(new Event("tick")); } /* IEventDispatcher */ public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false) : void { _dispatcher.addEventListener(type, listener, useCapture, priority, useWeakReference); } public function dispatchEvent (event:Event) : Boolean { return _dispatcher.dispatchEvent (event); } public function hasEventListener (type:String) : Boolean { return _dispatcher.hasEventListener (type); } public function removeEventListener (type:String, listener:Function, useCapture:Boolean = false) : void { _dispatcher.removeEventListener (type, listener, useCapture); } public function willTrigger (type:String) : Boolean { return _dispatcher.willTrigger(type); } } } package { import flash.display.Sprite; import flash.events.Event; import flash.display.StageAlign; import flash.display.StageScaleMode; public class Main extends Sprite { private var _ticker:IEDClass; 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); _ticker = new IEDClass(); _ticker.addEventListener("tick", onTick); } private function onTick(event:Event):void { trace(event.target, event.currentTarget); // "[object IEDClass] [object IEDClass]" } } }
__________________
Reality.getBounds(this); |
|
|||||
|
GBee, мне вот и не было понятно зачем указывать target. В Вашем примере если
вместо сделать ничего бы не изменилось. Wolsh, спасибо теперь понятно. Что то не подумал о сходстве поля target у Event`а и аргумента target у ED. ![]() UPD: Ха-ха, перечитал свой вопрос. Целью читал как цепью, да и даже читая как "цель" не очень очевидно, что имеется ввиду target. Наверное, стоит читать английиский хелп.
__________________
Тут мужик танцует и поёт про флэш |
![]() |
![]() |
Часовой пояс GMT +4, время: 15:55. |
|
|
« Предыдущая тема | Следующая тема » |
|
|