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;
}
}
제출 방법에서 분명히 "RES res"의 인스턴스를 전달하고 사용할 수 있지만 너무 많은 추가 상용구없이 일반 RPC 내에서 수행 될 수 있기를 바랬습니다. 어떻게 든 dart에서 가능합니까?
http://dartbug.com/10667 과 관련된 것 같습니다.
비슷한 상황에서 내가 한 일은 폐쇄 된 생성자에 유형을 매핑하는 정적 맵을 만드는 것이 었습니다. 메시지 유형과 해당 유형의 새 인스턴스를 만드는 각각에 대한 클로저로 맵을 초기화합니다. 그런 다음 유형 인수를 사용하여 클로저를 찾고 반환 된 클로저를 호출하여 새 인스턴스를 얻습니다.
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']();
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다