将Class作为参数传递

时间:2013-08-13 19:19:54

标签: haxe

我正在尝试传递一个Class引用并在函数中实例化它。这不起作用:

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

它提供了Unexpected (

这是否可以在Haxe 3中使用?

2 个答案:

答案 0 :(得分:11)

Class有一个Type Parameter,所以如果您要接受一个类作为参数,则需要指定一个类型参数。

接受任何课程:

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

仅接受“sys.db.Object”类或子类:

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

Haxe 3也允许generic functions

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

这里你声明函数是通用的,这意味着对于每个不同的类型参数,将编译不同版本的函数。你接受Class,其中T是类型参数 - 在这种情况下是动态的,所以它适用于任何类。最后,使用泛型函数让你编写new T(),这似乎是一种更自然的语法,并且在某些平台上可能会有性能优势。

答案 1 :(得分:4)

在Haxe3和Haxe2中有可能

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

}

注意:如果你想要新的T()工作,Haxe3类(实现foo的地方)必须是@:generic。

Haxe2是另一个故事:

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

}