2011-09-29 6 views

答えて

24

は名前によって動的にクラスのインスタンスを作成します。私ははい、getDefinitionByNameを使用FlagFrance

+0

おそらく、getDefinitionByName呼び出しの結果をキャッシュするのが賢明でしょう。私はそれがどれほど遅いのか分かりませんが、反射を含んでいるので、おそらくそれほど速くはありません。 –

+0

@Laurentはい、この方法でクラスに複数回アクセスする必要がある場合は、戻り値を独自のvarに格納します。しかし、getDifinitionByName呼び出しのための一般的なキャッシュを作ることはそれほど賢明ではないかもしれません。私が使った時代は一度しか呼ばれていない!したがって、キャッシュされた結果を持つことはメモリを消費するだけです。 – RasmusWL

7

のように、文字列表現を意味します。この次のコードを使用することができないために:

//cc() is called upon creationComplete 
    private var forCompiler:FlagFrance; //REQUIRED! (but otherwise not used) 

    private function cc():void 
    { 
     var obj:Object = createInstance("flash.display.Sprite"); 
    } 

    public function createInstance(className:String):Object 
    { 
     var myClass:Class = getDefinitionByName(className) as Class; 
     var instance:Object = new myClass(); 
     return instance; 
    } 

getDefinitionByNameのためのドキュメントは言う:

"Returns a reference to the class object of the class specified by the name parameter." 

私たちはクラスとして戻り値を指定するために必要な上記のコード?これは、getDefinitionByNameもFunction(たとえば、flash.utils.getTimer - どのクラスにもないパッケージレベルの関数)を返すことができるためです。戻り値の型はFunctionまたはClassのいずれかになる可能性があるため、Flexチームは戻り値の型をObjectに指定し、必要に応じてキャストを実行することが期待されます。

上記のコードは、ドキュメントに記載されている例とよく似ていますが、いずれにしても、それは悪い例です。flash.display.Spriteについてはすべて正常に動作しますが、カスタムクラスでも同じことを試みてください。次のエラーで: - 例えば

ReferenceError: Error #1065: Variable [name of your class] is not defined. 

エラーの理由は、あなたのコード内のクラスへの参照を持たなければならないということです

private var forCompiler:SomeClass; 

あなたのクラスはコンパイル時に.swfファイルにでコンパイルされることはありませんこれを実行せずに:あなたは、変数を作成し、それはとても似Typeの指定する必要があります。コンパイラには、実際に使用されるクラス(インポートされたクラスだけではありません)が含まれます。これは.swfのサイズを最適化するためです。したがって、変数を宣言する必要は、実際には見過ごしやバグと見なされるべきではありませんが、直接使用しない変数を宣言するのは面倒です。

関連する問題