読者です 読者をやめる 読者になる 読者になる

Shut the fuck up and write some code

グダグダ言わずにコードを書きたいブログ

Delegateのサンプルを作ってみた。

flashlite3.0 flashlite2.0 AS2

仕事のMTGにて「addEventListenerはremoveするのを忘れやすいからcallbackで実装だ〜」と言われたものの、無知なものでどうやって実装するのかさっぱりわからなかったのでサンプルを作ってみた。


大元のクラス testCallback.as

import mx.utils.Delegate

class testCallback {
	
	private var text1:String = "hello"
	public var text2:String = "world"
	
	public function testCallback() {
		
		var delegate_test:Function = Delegate.create(this, doTest)
		var callbacktest:callback = new callback()

		//ダメ 出力はundefined
		callbacktest.excute(doTest)
		
		//delegeteしてスコープを委譲させると正しく出力
		callbacktest.excute(delegate_test)
		
	}
	
	public function doTest():Void {
		trace(text1)
		trace(text2)
	}
	
}


callbackするクラス callback.as

class callback {
	
	public function callback() {}
	
	public function excute(func:Function):Void{
		func.call()
	}
	
}


コールバックさせたい関数をそのままコールバック元のクラスに突っ込むと、動作はするものの呼び出し元のクラスが違うため変数のスコープがおかしく変数の受け渡し等がうまく動かない。
けどDelegateさせてスコープも元のクラスにさせることで、変数のスコープも正しいものになる。


何か間違ってる気がしないわけでもないが、まあそういうことだろう、と強引に乗り切る。