我想保持字符串到已定义类的恒定映射,这些已定义类均从单个类A继承:
class A {}
class B extends A {}
class C extends A {}
class D extends A {}
const strToType = {
'str1': B,
'str2': C,
'str3': C,
'str4': D,
// etc.
};
因此,我假设此映射采用Map<String, Type>
的形式,我什至尝试明确声明:<String, Type>{ /*...*/ }
仍然,我无法像使用Python这样的其他语言一样,使用该映射来动态地决定要创建哪个对象:
A variable = new strToType[someString](args);
在这种情况下,Dart检查器显示的错误为strToType is not a class
。
我尝试将strToType[someString]
用括号括起来,然后它会抱怨new (
部分。
实现我在Dart中所做的最好的方法是什么?我想避免大量的switch语句和代码重复,因为B
,C
,D
具有相同的构造界面,并且不止3个类。
编辑:请注意,在我的情况下,该类的字符串标识符仅在运行时才知道,我将收到字符串流,并基于此创建一个{ {1}},其中元素是List<A>
的专门后代。
答案 0 :(得分:0)
Dart Type
对象是代表类型的不透明标记。它们不是类型本身。
您不能在需要类的地方使用Type
对象,因此不能执行new TypeVar()
或TypeVar.staticMember
。
如果要存储创建子类对象的方法,则需要存储执行此操作的函数。
const strToType = <String, A Function(argTypes)> {
'str1': (args) => new A(args),
'str2': (args) => new C(args),
'str3': (args) => new C(args),
'str4': (args) => new D(args),
// etc.
};
然后您可以根据需要使用它:
A variable = strToType[someString](args);
只要所有构造函数都接受相同的参数。