Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Generics 在dart中实例化泛型类_Generics_Dart - Fatal编程技术网

Generics 在dart中实例化泛型类

Generics 在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”]

我已经看过使用typedef的stackoverflow示例,但它看起来主要用于回调,所以不确定它是否与我正在处理的相关。 我正在使用泛型实现一个类,该泛型执行RPC

抽象类消息{
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();