Dart 如何在抽象类中声明工厂构造函数?

Dart 如何在抽象类中声明工厂构造函数?,dart,Dart,我想声明,但不是在抽象类中定义工厂构造函数 在我的例子中,我想创建一个方法,该方法接受实现字符串toJson()方法以及fromJson(映射数据)工厂构造函数的任何类 有什么方法可以在Dart中实现这一点吗? 我正在寻找以下类似的内容,这不是有效的Dart代码: 抽象类JsonSerializable{ factory fromJson(地图数据); 字符串toJson(); } 恐怕它不能按您希望的方式工作 构造函数不是接口的一部分。它们的行为更像静态成员。 因此,您不能将工厂添加到接口中,

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

在我的例子中,我想创建一个方法,该方法接受实现
字符串toJson()
方法以及
fromJson(映射数据)
工厂构造函数的任何类

有什么方法可以在Dart中实现这一点吗? 我正在寻找以下类似的内容,这不是有效的Dart代码:

抽象类JsonSerializable{
factory fromJson(地图数据);
字符串toJson();
}

恐怕它不能按您希望的方式工作

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

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

您可以将工厂声明为普通方法,但是只有在已经有实例的情况下才能调用它,这可能不是您想要的构造函数

传递代码的唯一方法是使用方法作为函数或对象。因此,如果您希望通过类型
JsonSerializable
对某个对象进行参数化,并且希望能够创建这样的对象,则需要传递一个工厂函数:


(如果
MyClass.fromJson
是一个静态函数,而不是构造函数,那么您可以编写
反序列化(jsonString,MyClass.fromJson)
,但Dart还没有构造函数分离)。

恐怕它不能按您希望的方式工作

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

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

您可以将工厂声明为普通方法,但是只有在已经有实例的情况下才能调用它,这可能不是您想要的构造函数

传递代码的唯一方法是使用方法作为函数或对象。因此,如果您希望通过类型
JsonSerializable
对某个对象进行参数化,并且希望能够创建这样的对象,则需要传递一个工厂函数:


(如果
MyClass.fromJson
是一个静态函数而不是构造函数,那么您可以编写
反序列化(jsonString,MyClass.fromJson)
,但Dart还没有解构构造函数)。

正如公认答案中所建议的那样,我最终创建了一个
序列化程序
类型,该类型由每个类的序列化程序实现:

事实证明,与直接在类上使用
toJson
/
fromJson
相比,这有几个好处:

  • 它将序列化逻辑与实际类分离。这意味着更好的代码可读性,因为类只包含与类直接相关的方法 — 序列化程序甚至可以放入自己的文件中
  • 当前,扩展无法创建构造函数。因此,单独使用序列化程序可以为现有类编写序列化程序,如
    String
    或flatter的
    Color
    ,其中不能只添加
    fromColor
    构造函数
  • 这两点结合在一起意味着它也可以很好地用于代码生成 — 这些类是手工编写的,序列化程序可以在单独的文件中生成

代码示例:

类水果{
水果(这个名字,这个颜色);
最后的字符串名;
最终字符串颜色;
}
//在另一个文件中
类序列化程序扩展了序列化程序{
地图toJson(水果){
返回。。。;
}
fromJson(地图数据){
还果(…);
}
}
然后,还将序列化程序传递给需要它的代码:

somethod(序列化程序序列化程序,T值){
...
}
someMethod(水果序列化器(),someFruit);
最终水果=重新创建水果(水果序列化器());

显然,您不能将无法序列化的对象传递给代码,因为该方法需要一个
序列化器

,正如在接受的答案中所建议的那样,我最终创建了一个
序列化器
类型,该类型由每个类的序列化器实现:

事实证明,与直接在类上使用
toJson
/
fromJson
相比,这有几个好处:

  • 它将序列化逻辑与实际类分离。这意味着更好的代码可读性,因为类只包含与类直接相关的方法 — 序列化程序甚至可以放入自己的文件中
  • 当前,扩展无法创建构造函数。因此,单独使用序列化程序可以为现有类编写序列化程序,如
    String
    或flatter的
    Color
    ,其中不能只添加
    fromColor
    构造函数
  • 这两点结合在一起意味着它也可以很好地用于代码生成 — 这些类是手工编写的,序列化程序可以在单独的文件中生成

代码示例:

类水果{
水果(这个名字,这个颜色);
最后的字符串名;
最终字符串颜色;
}
//在另一个文件中
类序列化程序扩展了序列化程序{
地图toJson(水果){
返回。。。;
}
fromJson(地图数据){
还果(…);
}
}
然后,还将序列化程序传递给需要它的代码:

somethod(序列化程序序列化程序,T值){
...
}
someMethod(FruitSerializer(),some
  T deserialize<T extends JsonSerializable>(
    String json,
    T factory(Map<String, dynamic> data),
  ) {
    return factory(jsonDecode(json) as Map<String, dynamic>);
  }