Generics 在dart中实例化泛型类
我已经看过使用typedef的stackoverflow示例,但它看起来主要用于回调,所以不确定它是否与我正在处理的相关。 我正在使用泛型实现一个类,该泛型执行RPCGenerics 在dart中实例化泛型类,generics,dart,Generics,Dart,我已经看过使用typedef的stackoverflow示例,但它看起来主要用于回调,所以不确定它是否与我正在处理的相关。 我正在使用泛型实现一个类,该泛型执行RPC 抽象类消息{ int created=new DateTime.now().millissecondssinceepoch; Map Map=newmap(); 映射到json(); void fromJson(字符串json){ map=JSON.decode(JSON); this.created=map[“created”]
抽象类消息{
int created=new DateTime.now().millissecondssinceepoch;
Map Map=newmap();
映射到json();
void fromJson(字符串json){
map=JSON.decode(JSON);
this.created=map[“created”];
}
字符串toString(){
返回JSON.encode(this);
}
消息(){
地图[“已创建”]=已创建;
}
}
___请求和响应都扩展了消息:
导入“Message.dart”;
类TestResponse扩展消息{
串试验;
字符串消息;
映射到JSON(){
map[“test”]=此测试;
返回图;
}
fromJson(字符串json){
super.fromJson(json);
this.test=map[“test”];
this.message=map[“message”];
}
}
现在,当我尝试创建一个通用RPC类来隐藏发送和接收消息的所有样板文件时,我需要创建一个响应类的新实例来将其发送回。
(我更愿意执行RPC.submit,但这会给我一个错误,即静态成员不能引用类型参数,因此我在这里的另一个选项是可能滥用构造函数语法,例如RPC.submit(json,uri).getResponse()…)
import'包:http/browser_client.dart';
导入“Message.dart”;
类RPC{
RES提交(请求、字符串uri){
var client=新浏览器客户端();
变量url=”http://localhost:9090/application-api“+uri;
RES RES=new RES();//似乎与
在类似的情况下,我所做的是创建一个静态映射,将类型映射到closurized构造函数。我使用消息类型初始化映射,并为每个类型创建一个闭包,从而创建该类型的新实例。
然后,我使用type参数查找闭包,并调用返回的闭包以获得一个新实例
var factories = {
'A': () => new A(),
'B': () => new B(),
'C': () => new C(),
};
...
var a = factories['A']();
您可以将工厂集成到类中
class A {
static A createNew() => new A();
}
var factories = {
'A': A.createNew,
'B': B.createNew,
'C': C.createNew,
};
...
var a = factories['A']();
你不能使用一个自定义工厂,根据需要生成响应并将其传递给你的RPC类。在我看来这很简单:
class RPC<REQ extends Message, RES extends Message> {
static MessageFactory factory;
RES submit(REQ req, String uri){
// ...
RES res = factory.createRES();
// ..
}
}
abstract class MessageFactory {
RES createRES();
}
class TestFactory extends MessageFactory {
RES createRES() {
return new TestResponse();
}
}
好的,根据那个bug报告,现在还不可能这样做。所以现在看来,获得一行RPC调用的最简单方法是执行TestResponse res=new RPC().submit(req,new TestResponse(),“/test”);Closurized构造函数听起来很混乱,但我可以看到其他可能有用的场景。谢谢居里!你能发布一个简单的代码示例来解释居里吗?@G居里zöchbauer-这将是一个很酷的特性。你知道这将在何时实现吗?
RPC.factory = new TestFactory();