8

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

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

它给Unexpected (.

这在 Haxe 3 中可能吗?

4

2 回答 2

13

有一个类型参数,所以如果你要接受一个类作为参数,你需要指定一个类型参数。

接受任何课程:

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 function foo<T:Dynamic>(t:Class<T>) {
    var myVar = new T();
    trace( Type.typeof(myVar) );
}

在这里,您将函数声明为泛型,这意味着对于每个不同的类型参数,将编译不同版本的函数。您接受 Class,其中 T 是类型参数 - 在本例中是动态的,因此它适用于任何类。最后,使用泛型函数 let's you write new T(),这似乎是一种更自然的语法,并且在某些平台上可能会带来性能优势。

于 2013-08-13T23:45:59.843 回答
4

在 Haxe3 和 Haxe2 中是可能的

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

}

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

Haxe2 是另一个故事:

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

}

于 2013-08-13T20:55:03.783 回答