2015-01-08 136 views
1

我已經看過使用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內部完成,而不太多額外的樣板,是否有可能在飛鏢?

回答

1

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

我類似的情況確實是創造它映射類型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'](); 
+0

確定,所以基於這樣的錯誤報告,這是沒有可能做到這一點。因此,現在看來,獲得單線程RPC調用的最簡單方法是執行TestResponse res = new RPC()。submit(req,new TestResponse(),「/ test」);經過修飾的構造函數聽起來很亂,但我可以看到其他可能有用的場景。感謝Günter! –

+0

你可以發表你的解釋Günter簡單的代碼示例? – Challe

+0

我更新了我的答案。 –

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();