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();
与 Type.createInstance()
方法不同,这不允许您将任意参数传递给它们甚至可能不接受的构造函数,因此它的类型安全性更高。它还自动与 dead code elimination 一起工作,因为 Haxe 看到构造函数被引用了。
我应该如何将字符串映射到 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();
与 Type.createInstance()
方法不同,这不允许您将任意参数传递给它们甚至可能不接受的构造函数,因此它的类型安全性更高。它还自动与 dead code elimination 一起工作,因为 Haxe 看到构造函数被引用了。