2013-08-13 12 views
7

私は、クラス参照を渡して、関数内でそれをインスタンス化しようとしています。これは動作しません:パラメータとしてクラスを渡す

function foo(myClassRef:Class):Void { 
    var myVar = new myClassRef(); 
} 
foo(MyClass); 

これはUnexpected (を示します。

これはHaxe 3で可能ですか?

答えて

11

ClassType Parameterを持っているので、あなたが引数としてクラスを受け入れるつもりなら、あなたは型パラメータを指定する必要があります。

@:generic function foo<T:Dynamic>(t:Class<T>) { 
    var myVar = new T(); 
    trace(Type.typeof(myVar)); 
} 

ここ:

function foo(myClassRef:Class<sys.db.Object>):Void { 
    var myVar = Type.createInstance(myClassRef, []); 
    trace(Type.typeof(myVar)); 
} 

haXeの3もgeneric functionsことができます:

function foo(myClassRef:Class<Dynamic>):Void { 
    var myVar = Type.createInstance(myClassRef, [constructorArg1, constructorArg2....]); 
    trace(Type.typeof(myVar)); 
} 

受け入れるだけ "sys.db.Object" クラスまたはサブクラス:

任意のクラスを受け入れます関数が汎用であることを宣言します。つまり、異なる型パラメータごとに、異なる関数関数のonがコンパイルされます。あなたはClassを受け入れます。ここで、Tは型パラメータです - この場合、動的なので、どのクラスでも動作します。最後に、汎用関数を使ってnew T()と書いてみましょう。より自然な構文に見えるかもしれませんが、一部のプラットフォームではパフォーマンス上の利点があります。

+0

Dead Code Eliminationがfull(-dce full)に設定されているだけで、他の場所で使用されていないクラスのコンストラクタは削除されます。 これを修正するには、コンストラクタシグネチャの先頭に@:keep metadata([this like](https://github.com/HaxeFoundation/haxe/issues/1891))を追加する必要があります。 – Veehmot

+0

私は間違っているかもしれませんが、ドキュメンテーション(haxe 3.2.0)によれば 'Type.createInstance(myClassRef、[args]);'つまり、paramsには 'constructor'はありません。 – chichilatte

+0

それは文章を書こうと私が書いただけだった。私は 'Type.createInstance(myClassRef、[arg1、arg2、arg3])'と書くこともできます。混乱のために申し訳ありません、私は答えを編集します –

4

それはHaxe3とHaxe2

function foo<T>(myClassRef:T):Void { 
var myVar = new T(); 

}

ノートで可能である:(fooが実装されている)Haxe3クラスでなければなりません@:あなたはT新しい()仕事をしたい一般的な場合。

Haxe2はまた別の話です:

function foo<T>(myClassRef:Class<T>):Void { 
var myVar = Type.createEmptyInstance(Type.getClass(myClassRef)); 

}

関連する問題