2013-04-22 20 views
0

我以前有以下代碼,它工作正常。 。(注意卡,SearchResult所,測驗的所有擴展持久化和持久化包含了構造.fromMap如何在Dart的類中調用構造函數?

Persistable fromString(String value){ 
    Map<String, dynamic> m = parse(value); 

    switch(m['type']){ 
    case 'card': 
     return new Card.fromMap(m); 
    case 'searchresults': 
     return new SearchResults.fromMap(m); 
    case 'quiz': 
     return new Quiz.fromMap(m); 
    } 
} 

這是一個有點羅嗦,所以我想我應該把它分成兩個部分我第一次有這樣的:

static final Map<String, Persistable> lookup = 
    {'card': Card, 
    'searchresults': SearchResults, 
    'quiz': Quiz }; 

似乎是合理的,但後來當我試圖重新定義的方法,我感到困惑。

Persistable fromString(String value){ 
    Map<String, dynamic> m = parse(value); 
    String type = m['type']; 
    Persistable p = lookup[type]; 
    ... Confused, this can't be right 
    ... ultimately want to "return new p.fromMap(m)"; 
} 

Persistable p真正意義的實例類Persistable。如何輸入我的lookup地圖,以使其值爲類Persistable,以便我可以調用它們的.fromMap構造函數?

+0

尋找工作示例代碼。 o從'Map <> lookut' JSon對象構建類'Persistable'?你可以通過'lookup []'強制轉換(?)到課程中?爲什麼你不能只是'Persistable p = new Persistable()。fromMap(lookup);'? – Jasper 2013-04-23 06:29:02

回答

2

首先,我認爲你的初始方法是完全有效的,不應該因爲它的冗長而被拋棄。 我相信替代方法引入了額外的複雜性,並且只有在您真的需要動態分派時纔是合理的。 (例如,如果你爲持久性編寫庫,並且希望爲庫的客戶端添加註冊任意類以實現持久性的功能) 如果動態調度對您是必須的,我相信有兩個主要可能性: - Reflection API。最近反射庫獲得了同步API,所以現在這種方式現在比以前更便宜。我相信無論如何總是會有一些反射產生的成本。 - 使用核心DART功能。

通過第二種方法,您可以使用某種技巧來動態模仿構造函數調用。 例如,你可以在地圖存儲沒有類型的變量,但它返回所需的類的實例函數:

所以,你的代碼可能看起來像

static final Map<String, Function> lookup = new Map<String, Function> 
static void registerClass(String className, factory) { 
    lookup[className] = factory; 
} 
static Persistable getInstance(String className, Map map){ 
    return lookup[className](map); 
} 

而且在客戶端:

.... 
registerClass('quiz', (map)=> new Quiz.fromMap(map)); 
registerClass('card', (map)=> new Card.fromMap(map)); 

(注意 - 我沒有測試這個) 你可以在https://github.com/vadimtsushko/objectory

相關問題