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
相比,这有几个好处:
- 它将序列化逻辑与实际类分离。这意味着更好的代码可读性,因为类只包含与类直接相关的方法 — 序列化程序甚至可以放入自己的文件中
- 当前,扩展无法创建构造函数。因此,单独使用序列化程序可以为现有类编写序列化程序,如
或flatter的String
,其中不能只添加Color
构造函数fromColor
- 这两点结合在一起意味着它也可以很好地用于代码生成 — 这些类是手工编写的,序列化程序可以在单独的文件中生成
代码示例:
类水果{
水果(这个名字,这个颜色);
最后的字符串名;
最终字符串颜色;
}
//在另一个文件中
类序列化程序扩展了序列化程序{
地图toJson(水果){
返回。。。;
}
fromJson(地图数据){
还果(…);
}
}
然后,还将序列化程序传递给需要它的代码:
somethod(序列化程序序列化程序,T值){
...
}
someMethod(水果序列化器(),someFruit);
最终水果=重新创建水果(水果序列化器());
显然,您不能将无法序列化的对象传递给代码,因为该方法需要一个
序列化器
,正如在接受的答案中所建议的那样,我最终创建了一个序列化器
类型,该类型由每个类的序列化器实现:
事实证明,与直接在类上使用toJson
/fromJson
相比,这有几个好处:
- 它将序列化逻辑与实际类分离。这意味着更好的代码可读性,因为类只包含与类直接相关的方法 — 序列化程序甚至可以放入自己的文件中
- 当前,扩展无法创建构造函数。因此,单独使用序列化程序可以为现有类编写序列化程序,如
或flatter的String
,其中不能只添加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>);
}