私は 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_test
ex_test
メソッドには簡単なコードが含まれていますが、メンバー変数などを含むステートメントが含まれている場合はどうなるでしょうか? 親オブジェクトがない場合、メソッドはどのように評価されますか?
さらに、(addCallback
任意のメソッドの受け渡しが許可されているように見えるため) ドキュメントでは、渡されたメソッドに対するアクセス修飾子の影響について言及されていません。メソッドに private というラベルを付けた場合でも、それを addCallback に渡すことはできますか? どうしたんだ?
誰かがこれについて頭を包むのを手伝ってくれれば幸いです。