具有通用方法的泛型

时间:2019-04-12 10:51:14

标签: dart flutter

我试图编写一个抽象的JsonSerializable类,以便具有这样的功能:

abstract class JsonSerializable<T>{
    T fromMap(Map<String,dynamic> map);
    Map<String,dynamic> toMap();
    T fromJsonString(String jsonString){
        return fromMap(json.decode(jsonString));
    }
    String toJsonString(){
        return json.encode(toMap());
    }
}

我的第一个问题是fromMapfromJsonString不能用作构造函数,因此我认为这样做可以做到这一点:

class Foo extends JsonSerializable<Foo>{

  Foo();
  factory Foo.fromMap(Map<String,dynamic> map){
    return fromMap(map);  
  }

  @override
  Foo fromMap(Map<String, dynamic> map) {
    // TODO: implement fromMap
    return null;
  }

  @override
  Map<String, dynamic> toMap() {
    // TODO: implement toMap
    return null;
  }
}

现在,由于我试图从工厂构造函数访问实例方法,因此上面的代码使Dart分析器抱怨。

所以我以为我可以实现这些方法而无需继承和覆盖它们(我知道,这是一个肮脏的解决方案),但这仍然无法为我提供一些信息,只能告诉“嘿,此类具有此方法”

我是否完全忽略了这一点?
是否有一个不涉及代码生成插件的干净解决方案,该插件显然不支持泛型?

我的API响应具有以下所有结构:

{
    "key1":"value1",
    "otherStuffKey":["blah", "blah"],
    "data": <the object I want to generalize>
}

我需要泛型,因为我想将序列化为data值的对象解析为具有相同行为的不同类。

PS:如果我要解析响应,则toMaptoJsonString方法是无用的,但是它们对于完成圆圈并允许使用也使用此JsonSerializable来序列化请求。

0 个答案:

没有答案