2012-04-20 9 views
3

ダイナミックプロキシクラスに動的に追加された関数を使用するのは簡単なことですが、Pythonでデコレータを使用する場合のように、型付き関数の呼び出しを傍受することができればと思っています。以下の例。私はAS3で型付き関数呼び出しを傍受する方法はありますか?

example

package 
{ 
    import flash.display.Sprite; 
    [SWF(width = '400', height = '400')] 
    public class Test extends Sprite 
    { 
     public function Test() 
     { 
      var t:TypeTest = new TypeTest(); 
      t.dynFunc = function dynFunc(s:String, i:int):Boolean { return true; }; 

      t.typedFunc("a", 1); 
      t.dynFunc("b", 2); 
     } 
    } 
} 
import flash.utils.Proxy; 
import flash.utils.flash_proxy; 

internal dynamic class TypeTest extends Proxy 
{ 
    private var customs:Object = new Object(); 
    override flash_proxy function callProperty(name:*, ...parameters):* { 
     var retval:* = (this[name] as Function).apply(null, parameters); 
     trace("called", name, "with", parameters); 
     return retval; 
    } 
    public function typedFunc(s:String, i:int):Boolean { 
     return false; 
    } 
    override flash_proxy function getProperty(name:*):* { return customs[name]; } 
    override flash_proxy function setProperty(name:*, value:*):void { customs[name] = value; } 
} 

答えて

2

。これは、ActionScriptで行うことは容易ではない、それはすでに「dynFunc」を介して行くように「typedFunc」の「callProperty」を介して行くことができるようにいくつかの方法をみたいですコンパイラは「通常の」ActionScript言語構造を使用して、実行時に密封クラスのメソッドを変更することを許可しないため、元のクラスの動作を変更することはできません。期間。

幸いにも、as3commons:bytecodeライブラリがあります。実行時に動的プロキシクラスを生成するために使用することができます。クラスのバイト配列表現を生成し、それをAVMにロードするので、他のクラスと同様に使用できます。元のクラスを青写真として使用して修正版に置き換えることも可能ですが、私はそれを試していないことを認めなければなりません。

関連する問題