« ページレベルとサイトレベルのSBM メモ | main | 高橋メソッド改 メモ »
2005年06月14日
静的クラスにmx.events.EventDispatcherを適用する方法
通常EventDispatcherによって、イベントモデルをミックスインする場合、インスタンスの生成時にクラスのコンストラクタ内EventDispatcher.initialize(this)を呼び出します。
しかし、インスタンスが存在しない静的クラスの場合、EventDispatcherの初期化はどのタイミングで行えばよいのでしょうか。
これは、「イベント機能を使用する前に必ず、フレーム1でクラス.init()を呼び出し、そこで初期化する」。
といったルールを設けることで、解決することができます。
しかしこれはinitの呼び忘れた場合、バグの温床となりえます。
そこで一見アクロバティックに見えつつも、安全に初期化を自動的に行う方法とか考えてみました。
public static function init(){
EventDispatcher.initialize(クラス名);
}
public static function addEventListener(eventName, obj){
init();
addEventListener(eventName, obj)
}
public static function removeEventListener(eventName, obj){
init();
removeEventListener(eventName, obj)
}
private static function dispatchEvent(eventObj){
init()
dispatchEvent(eventObj);
}
こんな感じ。
まず、クラス内にあらかじめダミーのaddEventListener等を作っておきます。このクラスのaddEventListenerが呼び出された場合、まずこのダミー内の初期化関数init()が呼び出されます。
public static function addEventListener(eventName, obj){
init();
addEventListener(eventName, obj)
}
init()内では、EventDispatcher.initialize()が呼び出され、ダミーの関数達が正規のaddEventListener等で上書きされます。
public static function init(){
EventDispatcher.initialize(クラス名);
}
addEventListenerは上書きされました。
しかし実はinitが終了した時点では、最初に呼び出されたダミーaddEventListenerはまだ存在しています。
この為、連続して次の行で再帰的にaddEventListner()が実行されます。
この2回目のaddEventListenerは、EventDispatcherによって上書きされた新しいaddEventListnerを呼び出します。
よって、ここでイベントが登録されます。
public static function addEventListener(eventName, obj){
init();
addEventListener(eventName, obj)
}
以後は上書きが有効になり、init()関数を呼び出すダミーの関数は二度と呼び出されません。
これで最初にaddEventListenerを使ったタイミングでのみ、EventDispatcher.initialize()が実行されました。
めでたしめでたし。
投稿者 Taka : 2005年06月14日 04:45
book
bookmark
trackbacks
this entry's trackback URL:
http://www.fladdict.net/cgi-bin/mt3/mt-tb.cgi/214