簡體   English   中英

如何在Dart中的類上調度構造函數?

[英]How do I dispatch a constructor on a class in Dart?

我以前有以下代碼,它工作正常。 (注意,Card,SearchResults,Quiz都擴展為Persistable,而Persistable包含構造函數.fromMap

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構造函數?

首先,我認為你最初的方法是完全有效的,不應該因為它的冗長而被丟棄。 我相信替代方法會帶來額外的復雜性,只有在您真正需要動態調度時才有道理。 (例如,如果您為了持久性而編寫庫,並且希望添加為庫的客戶端注冊任意類以保持持久性的能力)如果動態調度是您必須的,我相信有兩種主要可能性: - Reflection API。 最近反射庫得到了同步API,所以這種方式現在比以前更實惠。 我相信無論如何反思總會產生一些成本。 - 使用核心DART功能。

使用第二種方法,您可以使用某種技巧來動態模仿構造函數調用。 例如,您可以在map中存儲而不是Type變量,而是返回所需類的實例的函數:

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

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中查找該方法的工作示例代碼

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM