Есть два основных вопроса, на которые нужно ответить при создании механики событий.
1) Как создать экземпляр диспетчера для моих событий?
Общими параметрами являются: расширение EventDispatcher или агрегатный экземпляр диспетчера.
В большинстве базовых и распространенных практик (и в официальных документах об этом также говорится) расширение класса EventDispatcher, что дает вашим классам диспетчеризацию событий.Возможности.
Плюсы : просто реализовать - просто введите расширение EventDispatcher, и все готово.
Минусы : вы не можете расширятьчто-то другое.Очевидно, именно поэтому многие нативные классы являются внуками EventDispatcher.Я думаю, просто чтобы избавить нас от неприятностей.
Второй общий подход - агрегирование экземпляра диспетчера.
package
{
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.events.IEventDispatcher;
public class ClassA implements IEventDispatcher
{
private var dispatcher:EventDispatcher;
public function ClassA()
{
initialize();
}
private function initialize():void
{
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, useWeakReference);
}
public function removeEventListener(type:String, listener:Function, useCapture:Boolean = false):void
{
dispatcher.removeEventListener(type, listener, useCapture);
}
public function dispatchEvent(event:Event):Boolean
{
return dispatcher.dispatchEvent(event);
}
public function hasEventListener(type:String):Boolean
{
return dispatcher.hasEventListener(type);
}
public function willTrigger(type:String):Boolean
{
return dispatcher.willTrigger(type);
}
}
}
Примечание: мы передаем ссылку на агрегирующий класс в конструктор диспетчера.Это сделано для того, чтобы event.target ссылался на ваш экземпляр класса, а не на сам экземпляр диспетчера.
Плюсы : вы можете расширять все, что захотите.Вы можете сделать некоторые трюки с диспетчерскими хуками, такие как ведение списка слушателей или что-то в этом роде.
Минусы : не так просто, как при первом подходе.
2) Как пройтипользовательские данные с моими событиями?
Общие параметры: передавать данные в экземпляре события или использовать ссылку на event.target только в обработчике событий для доступа к некоторым данным из источника.
Если вы выбираете доступ ко всем необходимым данным через событие.target - никакой дополнительной работы не требуется, просто приведите эту ссылку в обработчике событий к соответствующему классу.
Если вы хотите передать некоторые данные вместе с событием, вы создаете подкласс Event, и этот класс должен быть публично видимым длякод, который обрабатывает события, как указано в ответе выше.AS3 - это строгая и строгая типизация, так почему бы вам не сопротивляться этому?
Переопределение метода clone () в подклассе Event необходимо только в том случае, если вы собираетесь перезапускать обработанные события.Официальные документы говорят, что вы должны делать это каждый раз, когда создаете собственный класс событий, просто чтобы быть в безопасности.