AS3でのイベント
AS3でのイベントモデルの設計方法です。
ハンドラーを渡す
一つ目の方法はハンドラーを渡す方法です。
この方法はAS2まではよく用いられてきました。
ただしAS3からthis参照が崩れないようになったので、this参照を一緒に渡す必要がありません。
コールバック先になにが返ってくるのかが外部からはわからないので、コールバック先に引数を与える場合には注意が必要です。
ActionScript2
class Hoge{ private var _path:Object; private var _method:String; public function setCallBack( path:Object , method:String ):void{ _path = path; _method = method; } private function _callCallBack():void{ _path[_method](); } }
ActionScript3
package{ public class Hoge{ private var _method:Function; public function setCallBack( method:Function ):void{ _method = method; } private function _callCallBack():void{ _method(); } } }
EventDispatcher、Eventを用いる
ActionScript3で標準的に用いられるイベントモデルです。
ActionScript3の場合主要なほとんどのクラスがEventDispatcherを継承しているので、とくに内部的にEventDispatcherのインスタンスを作らずに実装可能です。
ActionScript3
//Custom Event package test{ public class HogeEvent extends Event{ public static const EVENT_SELECTED:String = "_testHogeEventSelected"; function HogeEvent(type:String, bubbles:Boolean = false, cancelable:Boolean = false){ super( type , bubbles , cancelable ); } } } //EventDispatcher package test{ public class Hoge extends EventDispatcher{ //call event private function _dispatchSelectedEvent():void{ var event:HogeEvent = new HogeEvent( HogeEvent.EVENT_SELECTED ); dispatchEvent( event ); } } }
var hoge:Hoge = new Hoge(); hoge.addEventListener( HogeEvent.EVENT_SELECTED , _onHogeSelected ); private function _onHogeSelected( event:HogeEvent ):void{ //EVENT }
上記のように、特定のクラスに対するイベントを別に定義してEventDispatcherを用いて受けられるようにする方法です。
この場合内部を作る人が間違えない限りはコールバック先に帰ってくるイベントは与えたイベントを持っているイベントクラスと限られる(上記ではHogeEvent)ので、第三者がそのクラスを使う場合にはコールバック先に返る型を特定することができます。
汎用化したイベントクラスをいくつか作って使いまわすよりも、クラスに対応したイベントを同じパッケージ内に都度作ることで第三者が見たときの可読性があがります。
また同じパッケージ内にイベントクラスを定義しておくことで値のセット系のメソッドをinternaにして外部から隠蔽することができます。
基本的にはAS3ではEventDispatcher+カスタムしたEventのモデルを使用した開発になるかと思います。