Class Haxe-将字符串映射到类

Class Haxe-将字符串映射到类,class,dictionary,types,haxe,Class,Dictionary,Types,Haxe,我应该如何将字符串映射到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 m

我应该如何将字符串映射到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 */);
class Foo{}
类栏扩展了Foo{}
类Buzz扩展了Foo{}
// (...)
变量类映射:映射=[
“abc”=>条形图,
“def”=>嗡嗡声
];
var myClass:Class=classMap[“abc”];
var myObj:Foo=新的myClass(/*params*/);

我原以为这会起作用,但它会在
myClass
之后抛出
意外(
)。怎么了?

你应该使用
Type.createInstance
来创建该类的实例。
new
只有在你想直接调用类名本身的构造函数时才会起作用
new Foo()

我建议你这样做:

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

在这里在线尝试:

与在映射中存储
并求助于反射进行实例化不同,存储对构造函数的引用(使用构造函数)是一种更好的模式,如中所述

var构造函数:MapFoo>=[
“abc”=>Bar.new,
“def”=>Buzz.new
];
var-construct:Void->Foo=构造函数[“abc”];
var myObj:Foo=construct();


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

如果构造函数需要不同类型的参数呢?我的意思是,
Map
方法f失去了它的意义。即使使用
Type.createInstance()
,您也必须检查字符串键以决定要传递哪些参数。
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();