2009-07-10 13 views
1

私はそうのようなイベントハンドラを追加し、私のクラスでオーバーライドされた機能、持っている:インプレースイベント処理関数からスーパーメソッドを呼び出すことができないのはなぜですか?

override public function hide():void { 
    ... 
    tween.addEventListener(TweenEvent.MOTION_FINISH, function(evt:Event):void { 
    ... 
    super.hide(); 
    }, false, 0, true); 
} 

これは動作しませんが、Flashが私に語った:「1006:スーパーの式は、クラスのインスタンスメソッド内で使用することができます。 " (適切なインスタンスメソッドに移動すると機能します)。

なぜ私はインプレースハンドラ関数からsuper.hide();への呼び出しを使用できないのか理解したいと思いますか?

問題のないインスタンス変数とメソッドをそこから参照できるので、そのハンドラが適切なコンテキストにアクセスできると考えました。 私はこれを理解するのを手伝ってください。

答えて

2

私はあなたが匿名メソッドの閉鎖に格納されます変数にする方法をキャプチャすることができると信じて。例:

override public function hide():void { 
    ... 
    var f:Function=super.hide; 
    tween.addEventListener(TweenEvent.MOTION_FINISH, function(evt:Event):void { 
     ... 
     f(); 
    }, false, 0, true); 
} 

閉鎖のコンセプトに苦労している場合は、さらに説明できます。

+0

私は一般的なアイデアよりも多くを持つために閉鎖を読むべきだと思います。ありがとう:) – kret

6

それは[object global]への匿名ファンクションポイントでthisは...行く、そしてそれをトレース持っているので、今AS3機能を使用すると、内部そこからインスタンスメンバにアクセスできること、である...、

ですが、それは本当に奇妙な機能です... this.myPropは、myPropは...これは暗い魔法ですが、自動的にクロージャを作成します...何らかの理由でインスタンスメンバで動作しますが、super ...

IMHOとにかく、プロトタイピングのためだけに、またはのパラメータとして、匿名関数を使用するべきではありませんforEachmapfilterなど方法...

greetz

back2dos

+0

このような長い休憩にごめんなさい。暗い魔法の理論が最もよく見える; ASDocでは、「スーパー」キーワード定義では、静的コンテキストでは使用できないと言われていますobviosly、おそらくASはグローバルを静的として扱います。わからない。 – kret

関連する問題