0

私は ActionScript にはかなり慣れていませんが、オブジェクト指向言語や手続き型言語全般については初めてというわけではありません。ただし、ActionScript の両方のカテゴリの機能の特定の組み合わせには、私は混乱します。

具体的には、 ExternalInterface.addCallback()のメカニズムについて混乱しています。メソッドのシグネチャは次のとおりです。

public static function addCallback(functionName:String, closure:Function):void

特に興味深いのは、次のドキュメントがあるクロージャー パラメーターです。

closure:Function — 呼び出す関数クロージャです。これは独立した関数である場合もあれば、オブジェクト インスタンスのメソッドを参照するメソッド クロージャである場合もあります。メソッド クロージャーを渡すことで、特定のオブジェクト インスタンスのメソッドにコールバックを向けることができます。

上記のことは、クロージャーが関数 (メソッドではない) にすぎないことを意味すると解釈します。これは、インスタンス化されたオブジェクトからのメソッド呼び出しを含むクロージャーである場合とそうでない場合があります。そのため、次のようなコード (同じドキュメント ページから取得) を見ると混乱します。

public class ext_test extends Sprite {
    function ext_test():void {
        ExternalInterface.marshallExceptions = true;
        ExternalInterface.addCallback("g", g);

        try {
        ExternalInterface.call("throwit");
        } catch(e:Error) {
        trace(e)
        }
    }
    function g() { throw new Error("exception from actionscript!!!!") }
    }

上記のコードは、インスタンス化されたオブジェクトを含むクロージャーでラップせずaddCallbackに、非静的メソッドであるto に挿入します。ext_testex_test

メソッドには簡単なコードが含まれていますが、メンバー変数などを含むステートメントが含まれている場合はどうなるでしょうか? 親オブジェクトがない場合、メソッドはどのように評価されますか?

さらに、(addCallback任意のメソッドの受け渡しが許可されているように見えるため) ドキュメントでは、渡されたメソッドに対するアクセス修飾子の影響について言及されていません。メソッドに private というラベルを付けた場合でも、それを addCallback に渡すことはできますか? どうしたんだ?

誰かがこれについて頭を包むのを手伝ってくれれば幸いです。

4

2 に答える 2

2

渡したメソッドがどのコンテキストで実行されるかを知りたい場合は、これは単にそれをアタッチしたコンテキストです。

ドキュメントのジバージャバーは、AS3とランタイムにいくつかの種類の関数があることを単に意味します。「自立型」関数とは、通常匿名関数と呼ばれるものを指します。これは、定義されたコンテキストを保持します。

var anonymous:Function = createAnonymous();
trace(anonymous()); // 123

function createAnonymous():Function {
    var internalStuff:Number = 123;
    var func:Function = function():Number {
        return internalStuff;
    }
    return func;
}

メソッドクロージャはクラスのメソッドのインスタンスであり、オブジェクトがこれらのクラスのインスタンスであるのと同じです。したがって、メソッドクロージャをに渡すとExternalInterface.addCallback()、コンテキスト(つまり、メンバー変数)が呼び出されるときに安全になります。

于 2013-01-20T21:42:58.687 に答える
0

うわー。私が見たすべての例addCallbackで、コンストラクターのコンテキストで実行されていることを完全に忘れていたため、コンストラクターに渡されたメソッド参照には、実行するコンテキストがあります。

そのため、クラス内のすべてがクラスによって表示されるため、アクセス修飾子は重要ではありません。

于 2013-01-20T17:25:49.913 に答える