« ページレベルとサイトレベルの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

dotfla.gif

bookmark

はてなブックマークに追加

del.icio.usに追加

trackbacks

this entry's trackback URL:
http://www.fladdict.net/cgi-bin/mt3/mt-tb.cgi/214

comment

コメントしてください




保存しますか?