我想在抽象类中声明但不定义工厂构造函数.

在我的例子中,我想创建一个接受实现String toJson()方法和fromJson(Map<String, dynamic> data)工厂构造函数的任何类的方法.

在DART中有什么方法可以做到这一点吗? 我正在查找类似以下内容的内容,它不是有效的DART代码:

abstract class JsonSerializable {
  factory fromJson(Map<String, dynamic> data);
  String toJson();
}

推荐答案

恐怕事情不是按照你想的那样进行的.

构造函数不是接口的一部分.他们的行为更像是静电会员. 因此,您不能将工厂添加到接口,并且在给定扩展此类型的类型变量的情况下,代码将无法调用工厂构造函数.

因此,由于构造函数不能是接口的一部分,所以构造函数也不能是abstract.抽象只是意味着"使成员成为接口的一部分,但不向类中添加任何实现".

你可以将工厂声明为一个普通方法,但是只有当你已经有一个实例时,你才能调用它,这可能不是你想要的构造函数.

传递code的唯一方式是作为函数或带有方法的对象.因此,如果您希望通过JsonSerializable的类型参数化某些内容,并且您希望能够创建这样的对象,则需要传递一个工厂function:

  T deserialize<T extends JsonSerializable>(
    String json,
    T factory(Map<String, dynamic> data),
  ) {
    return factory(jsonDecode(json) as Map<String, dynamic>);
  }

然后你可以用以下方式来称呼它:

var myValue = deserialize(jsonString, (x) => MyClass.fromJson(x));

(如果MyClass.fromJson是静电函数而不是构造函数,您可以只编写deserialize(jsonString, MyClass.fromJson),但是DART还没有构造函数).

Dart相关问答推荐

播放和暂停 Flutter 动画

Card宽度与父级匹配

如何在 Flutter 中忽略整个文件的 lint 规则?

如何在 Dart 中创建一个空 Set

flutter命令运行失败

NoSuchMethodError:在 null 上调用了方法validate

判断 Future 是否完整

如何在Dart中按布尔对列表进行排序

如何在 Flutter 中管理 Firebase 身份验证状态?

在Flatter中导航后,无法关注新页面中的文本字段

如何在Flutter 的http.MultipartRequest请求上上传文件时获取进度事件

如何提取dart/Flutter视频元数据

如何仅从 DateTime.now() 中提取时间;

Flutter:如何获取assets目录中所有图像的名称列表?

向 javascript 公开 Dart 函数

dart和下划线

如何在 Dart 中调用超类的构造函数和其他语句?

Dart 中的 final 修饰符有什么作用?

如何将 3 字节的 unicode 字符写为字符串文字

Dart 中的外部是什么意思?