在飞镖中实例化通用 class
Instantiating a generic class in dart
我已经使用 typedef 查看了 Whosebug 上的示例,但它看起来主要用于回调,因此不确定它是否与我正在处理的内容相关。
我正在使用执行 RPC 的泛型实现 class ...
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 class 时,我需要创建响应的新实例 class 以将其发回。
(我更愿意做 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;
}
}
在我的提交方法中,我显然可以传入 "RES res" 的一个实例并使用它,但我希望它可以在通用 RPC 中完成而无需太多额外的样板,不知何故在飞镖中可能吗?
相关
我在类似情况下所做的是创建一个静态映射,将类型映射到封闭的构造函数。我使用消息类型初始化映射,并为每个闭包创建该类型的新实例。
然后我使用类型参数查找闭包并调用返回的闭包以获取新实例。
var factories = {
'A': () => new A(),
'B': () => new B(),
'C': () => new C(),
};
...
var a = factories['A']();
您可以将工厂集成到 class
class A {
static A createNew() => new A();
}
var factories = {
'A': A.createNew,
'B': B.createNew,
'C': C.createNew,
};
...
var a = factories['A']();
您不能使用自定义工厂来生成您需要的响应并将其传递给您的 RPC class。这对我来说似乎很直接:
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();
我已经使用 typedef 查看了 Whosebug 上的示例,但它看起来主要用于回调,因此不确定它是否与我正在处理的内容相关。 我正在使用执行 RPC 的泛型实现 class ...
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 class 时,我需要创建响应的新实例 class 以将其发回。 (我更愿意做 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;
}
}
在我的提交方法中,我显然可以传入 "RES res" 的一个实例并使用它,但我希望它可以在通用 RPC 中完成而无需太多额外的样板,不知何故在飞镖中可能吗?
我在类似情况下所做的是创建一个静态映射,将类型映射到封闭的构造函数。我使用消息类型初始化映射,并为每个闭包创建该类型的新实例。 然后我使用类型参数查找闭包并调用返回的闭包以获取新实例。
var factories = {
'A': () => new A(),
'B': () => new B(),
'C': () => new C(),
};
...
var a = factories['A']();
您可以将工厂集成到 class
class A {
static A createNew() => new A();
}
var factories = {
'A': A.createNew,
'B': B.createNew,
'C': C.createNew,
};
...
var a = factories['A']();
您不能使用自定义工厂来生成您需要的响应并将其传递给您的 RPC class。这对我来说似乎很直接:
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();