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