Haxe - 将字符串映射到 class

Haxe - mapping a string to a class

我应该如何将字符串映射到 Haxe 中的 class,然后实例化它?

class Foo{}
class Bar extends Foo{}
class Buzz extends Foo{}

// (...)

var classMap:Map<String, Class<Foo>> = [
    "abc" => Bar,
    "def" => Buzz
];
var myClass:Class<Foo> = classMap["abc"];
var myObj:Foo = new myClass(/* params */);

我认为这会起作用,但它在 myClass 之后抛出 unexpected (。怎么了?

您应该使用 Type.createInstance 创建 class 的实例。 new 仅当您想直接调用 Class 名称本身的构造函数时才有效 new Foo()

我建议你这样做:

var myClass:Class<Foo> = classMap["abc"];
var myObj:Foo = Type.createInstance(myClass, [/* params */]);

在此处在线试用:https://try.haxe.org/#3134A

与其在映射中存储 Class<T> 并诉诸反射进行实例化,不如存储对构造函数的引用(使用它们的 function type) as detailed in this haxe.org blog post.

是一种更好的模式
class Foo {}
class Bar extends Foo {
    public function new() {}
}
class Buzz extends Foo {
    public function new() {}
}
var constructors:Map<String, Void->Foo> = [
    "abc" => Bar.new,
    "def" => Buzz.new
];
var construct:Void->Foo = constructors["abc"];
var myObj:Foo = construct();

https://try.haxe.org/#49E93

Type.createInstance() 方法不同,这不允许您将任意参数传递给它们甚至可能不接受的构造函数,因此它的类型安全性更高。它还自动与 dead code elimination 一起工作,因为 Haxe 看到构造函数被引用了。