在dart中实例化泛型类

时间:2015-01-08 05:43:15

标签: generics dart

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

abstract class Message {

  int created = new DateTime.now().millisecondsSinceEpoch;
  Map map = new Map();

  Map toJson();
  void fromJson(String json){
    map = JSON.decode(json);
    this.created = map["created"];
  }

  String toString() {
    return JSON.encode(this);
  }

  Message(){
    map["created"] = created;
  }

}

___ Request和___Response都扩展了消息:

import 'Message.dart';

class TestResponse extends Message {

  String test;
  String message;

  Map toJson() {
    map["test"] = this.test;
    return map;
  }

  fromJson(String json) {
    super.fromJson(json);
    this.test = map["test"];
    this.message = map["message"];
  }

}

现在,当我尝试执行隐藏发送和接收消息的所有样板的通用RPC类时,我需要创建响应类的新实例以将其发送回去。 (我本来希望做RPC.submit,但这给了我一个错误,说静态静态成员不能引用类型参数,所以我的另一个选择是滥用构造函数语法,例如RPC.submit(json,uri).getResponse ()...)

import 'package:http/browser_client.dart';
import 'Message.dart';

class RPC<REQ extends Message, RES extends Message> {

  RES submit(REQ req, String uri){
    var client = new BrowserClient();
    var url = "http://localhost:9090/application-api" + uri;
    RES res = new RES(); // <----- can't do this
    client.post(url, body: req.toString()).then((response){
      print("Response status: ${response.statusCode}");
      print("Response body: ${response.body}");
      res.fromJson(response.body);

    });
    return res;  
  }

}

在我的提交方法中,我显然可以传入&#34; RES res&#34;并且只是使用它,但是我希望它可以在通用RPC中完成,而不需要太多额外的样板,是否有可能在飞镖中?

2 个答案:

答案 0 :(得分:1)

似乎与http://dartbug.com/10667

有关

我在类似情况下所做的是创建一个静态地图,将类型映射到闭合构造函数。我使用消息类型初始化映射,并为每个创建该类型的新实例的闭包。 然后我使用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']();

答案 1 :(得分:0)

您是否可以使用自定义工厂根据需要生成响应并将其传递给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();
  }
}

//代码中的某个地方

RPC.factory = new TestFactory();