Event クラスを拡張すると、自前のイベントクラスを定義することができます。例えば、以下のような感じです。(あまり意味のない例ですが...)
public class CustomEvent extends Event { public function CustomEvent() { super("customEvent"); } public override function clone():Event { return new CustomEvent(); } }
(Event のサブクラスを実装する際は、clone() メソッドを実装する必要があります。override キーワードについては別の機会に説明します。)
EventDispatcher クラスの記事で紹介した dispatchEvent() メソッドを使うと、自分でイベントのディスパッチができます。例えば Sprite は EventDispatcher のサブクラスでしたから、次のようにして CustomEvent をディスパッチできます。
public class CustomEventSprite extends Sprite { public function dispatchCustomEvent() { dispatchEvent(new CustomEvent()); } }
あとはイベント処理を呼び出すためのイベントリスナーを登録すれば完了です。
public class EventTest extends Sprite { public function EventTest() { var ceSprite:CustomEventSprite = new CustomEventSprite(); ceSprite.addEventListener("customEvent", onCustomEvent); ceSprite.dispatchCustomEvent(); } private function onCustomEvent(event:CustomEvent):Void { // ここにイベント処理を記述 } }
以上が、カスタムイベントの基本的な使い方です。
さて、AS3 では多重継承が許されないため、必ずしも EventDispatcher のサブクラスに出来るとは限りません。そのような場合には、IEventDispatcher インターフェースを使用します。クラス内部で EventDispatcher のインスタンスを持ち、そこに処理をデリゲートするという使い方です。
public class DecoratedDispatcher extends SomeClass implements IEventDispatcher { var eventDispatcher:EventDispatcher; public function DecoratedDispatcher(){ eventDispatcher = new EventDispatcher(); } public function dispatchEvent(evt:Event):Boolean{ return eventDispatcher.dispatchEvent(evt); } ... ... }
本来は、全てのメソッドをデリゲートするのですが、長くなるため上の例は途中ではしょってあります。(念のため)
コメントする