2015-01-08 6 views
1

typedef를 사용하여 stackoverflow 예제를 살펴 봤지만 주로 콜백에 사용 된 것처럼 보입니다. 따라서 내가 작업중인 항목과 관련이 있는지 확실하지 않습니다. 내가 그 가죽 일반 RPC 클래스를 할 때 이제다트의 일반 클래스 인스턴스화

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"]; 
    } 

} 

: 나는 ...

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 모두 ​​확장 메시지 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 입술"의 인스턴스에 전달하고 그냥 사용하지만, 나는 그것이없이 일반 RPC 내부에서 수행 될 수 있음을 기대했다 수 너무 많은 여분의 상용구가 어떻게 든 다트에서 가능합니까?

답변

1

은 closurized 생성자에 형식을 매핑하는 정적지도를 만드는 것이었다 내가 비슷한 상황에서 한 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'](); 
+0

확인 코드에서

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 호출을 얻는 가장 간단한 방법은 TestResponse res = new RPC(). submit (req, new TestResponse(), "/ test"); 클로저 된 생성자는 지저분하게 들리지만 유용 할 수있는 다른 시나리오를 볼 수 있습니다. 감사합니다 귄터! –

+0

설명의 간단한 코드 예를 게시 할 수 있습니까? – Challe

+0

내 대답이 업데이트되었습니다. –

0

당신이 그들을 필요로하고 RPC 클래스에 전달로 응답을 생성 한 사용자 정의 공장을 사용할 수 없습니다 클래스에 공장을 통합 할 수 있습니다. 그것은 나에게 매우 정직 보인다 그래서 버그 리포트를 기반으로

RPC.factory = new TestFactory(); 
관련 문제