イベントの仕組みを考えるとき、答えるべき基本的な質問が 2 つあります。
1) イベントのディスパッチャ インスタンスを作成するにはどうすればよいですか?
一般的なオプションは次のとおりです。EventDispatcher を拡張するか、ディスパッチャー インスタンスを集約します。
最も基本的で一般的な方法 (および公式ドキュメントにも記載されています) は、EventDispatcher クラスを拡張して、クラスにイベント ディスパッチ機能を提供することです。
長所: 簡単に実装できます。 extends EventDispatcher と入力するだけで完了です。
短所:他のものを拡張することはできません。どうやら、これが多くのネイティブ クラスが EventDispatcher の孫である理由です。手間を省くためだと思います。
2 番目の一般的なアプローチは、ディスパッチャ インスタンスを集約することです。
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 参照のみを使用してソースから一部のデータにアクセスします。
event.target を介して必要なすべてのデータにアクセスすることを選択した場合 -- 追加の作業は必要ありません。イベント ハンドラーでこの参照を適切なクラスにキャストするだけです。
イベントと一緒にデータを渡したい場合は、イベントをサブクラス化し、上記の回答が示すように、このクラスはイベントを処理するコードにパブリックに表示される必要があります。AS3 は厳格で強力な型付けがすべてです。
Event サブクラスで clone() メソッドをオーバーライドする必要があるのは、処理されたイベントを再ディスパッチする場合のみです。公式ドキュメントによると、念のため、カスタム イベント クラスを作成するたびに、これを行う必要があります。