0

AS3では、メンバー関数を呼び出すことにより、メンバー変数(または定数)を初期化できます。これは、コンストラクターが呼び出される前に発生します。それまでの間、コンストラクター関数がまだ発行されていなくても、初期化メンバー関数で「this」キーワードに完全にアクセスできます。

これは時限爆弾のように聞こえます。上記の慣行について誰かコメントできますか?

編集 :

...
private var member:Sprite = getSprite(); // called before constructor
...
private function getSprite():Sprite {
    var spr:Sprite = new Sprite();
    this.addChild(spr); // 'this' used before constructor
    return spr;
}
4

2 に答える 2

3

私が理解しているように、それは問題ありません(本当に素晴らしくて読みやすいとは言えませんが)。new が呼び出されたときに何が起こるかは次のとおりです。

  1. インスタンスにメモリが割り当てられます(this使用可能になります)
  2. すべてのメンバーが初期化されます (デフォルトまたは指定されたものに)
  3. コンストラクターが呼び出されます
  4. new戻り値this

危険なのはgetSprite()、コンストラクター (呼び出された場合は親コンストラクターを含む) で初期化されるものを必要としないことを確認する必要があることです。私はそれを避け、代わりにコンストラクターですべてを初期化します。

于 2012-10-07T21:41:12.733 に答える
0

あなたは本当にあなたが言っていることをすることができません。インスタンスがまだ構築されていない場合、インスタンスの非静的メソッドにアクセスできない可能性があります。super を呼び出すコンストラクターに関する Jonatan のコメントに関しては、コンストラクター本体に super() の呼び出しを入れない場合、これは暗黙的に行われ、メソッドの先頭で自動的に発生します。オブジェクト指向言語でオブジェクトを構築すると、クラスのすべてのメンバーにメモリが割り当てられます。

あなたが言うなら:

var myVar:MyObject;
myVar.doSomething(); //this line creates a null pointer exception because myVar is null

代わりに次のように言うとします。

var myVar:MyObject = MyObject.createInstance(); // assuming createInstance is a static method that returns an instance of MyObject
myVar.doSomething(); //assuming createInstance() didn't return null then this works

しかし、この 2 番目のケースでは、静的メソッド createInstance() 内から「this」キーワードを参照することはできません。

私が述べていることに反論する完全な例を示した場合は、それを実行して投稿を削除しますが、私はここにいると確信しています.

于 2012-10-08T02:36:37.787 に答える