gpt4 book ai didi

dart - 如何在Dart中的类上调度构造函数?

转载 作者:行者123 更新时间:2023-12-03 04:31:48 26 4
gpt4 key购买 nike

我以前有以下代码,它工作正常。 (请注意,Card,SearchResults,Quiz都扩展了Persistable,并且Persistable包含构造函数.fromMap

Persistable fromString(String value){
Map<String, dynamic> m = parse(value);

switch(m['type']){
case 'card':
return new Card.fromMap(m);
case 'searchresults':
return new SearchResults.fromMap(m);
case 'quiz':
return new Quiz.fromMap(m);
}
}

有点罗word,所以我想将其分为两部分。我首先有这个:

static final Map<String, Persistable> lookup =
{'card': Card,
'searchresults': SearchResults,
'quiz': Quiz };

似乎很合理,但是当我尝试重新定义方法时,我感到困惑。

Persistable fromString(String value){
Map<String, dynamic> m = parse(value);
String type = m['type'];
Persistable p = lookup[type];
... Confused, this can't be right
... ultimately want to "return new p.fromMap(m)";
}
Persistable p实际上意味着 Persistable类的实例。如何键入 lookup映射,使其值属于 Persistable类,以便可以调用其 .fromMap构造函数?

最佳答案

首先,我认为您的初始方法是完全有效的,不应仅仅因为其冗长而被抛弃。
我相信替代方法会增加额外的复杂性,只有在您确实需要动态调度时才有理由。 (例如,如果您为持久性编写库,并且希望为库的客户端添加为持久性注册任意类的功能)
如果您必须进行动态调度,那么我相信有两种主要可能性:
-反射API。最近,反射库获得了同步API,因此这种方法现在比以前便宜得多。我相信反光总是会产生一些费用。
-使用核心DART功能。

使用第二种方法,您可以使用某种技巧来动态模拟构造函数调用。
例如,您可以在 map 中存储的不是Type变量,而是存储返回所需类实例的函数:

所以你的代码可能看起来像

static final Map<String, Function> lookup = new Map<String, Function>
static void registerClass(String className, factory) {
lookup[className] = factory;
}
static Persistable getInstance(String className, Map map){
return lookup[className](map);
}

在客户端:

....
registerClass('quiz', (map)=> new Quiz.fromMap(map));
registerClass('card', (map)=> new Card.fromMap(map));

(注意-我没有对此进行测试)
您可以在 https://github.com/vadimtsushko/objectory中寻找该方法的工作示例代码

关于dart - 如何在Dart中的类上调度构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16158584/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com