Haxe-将字符串映射到类

Mat*_*ski 3 dictionary types haxe class

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

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 */);
Run Code Online (Sandbox Code Playgroud)

我以为这会行得通,但此事会unexpected (发生myClass。怎么了?

Gam*_*a11 7

与其存储Class<T>在地图中而不是借助反射进行实例化,而是一种更好的模式,如haxe.org博客文章中所述,存储对构造函数的引用(使用其函数类型)。

class Foo {}
class Bar extends Foo {
    public function new() {}
}
class Buzz extends Foo {
    public function new() {}
}
Run Code Online (Sandbox Code Playgroud)
var constructors:Map<String, Void->Foo> = [
    "abc" => Bar.new,
    "def" => Buzz.new
];
var construct:Void->Foo = constructors["abc"];
var myObj:Foo = construct();
Run Code Online (Sandbox Code Playgroud)

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

与这种Type.createInstance()方法不同,这不允许您将任意参数传递给它们甚至可能不接受的构造函数,因此它是类型安全的。由于Haxe看到已引用构造函数,因此它也可以自动消除无效代码