我想在一个抽象类中声明,但不是定义一个工厂构造函数。
在我的例子中,我想创建一个方法,它接受任何实现String toJson()
方法和fromJson(Map<String, dynamic> data)
工厂构造函数的类。
有没有办法在Dart中实现这一点?我正在寻找类似以下的内容,这不是有效的Dart代码:
abstract class JsonSerializable {
factory fromJson(Map<String, dynamic> data);
String toJson();
}
3条答案
按热度按时间wpcxdonn1#
恐怕事情不会如你所愿。
构造函数不是接口的一部分。他们的行为更像是静态成员。因此,您不能向接口添加工厂,并且代码也没有任何方法来调用工厂构造函数,因为给定了一个扩展此类型的类型变量。
因此,由于构造函数不能是接口的一部分,因此构造函数也不能是抽象的。抽象仅仅意味着“使成员成为接口的一部分,但不向类中添加实现”。
你可以将工厂声明为一个普通的方法,但是只有当你已经有了一个示例的时候才能调用它,这可能不是你想要的构造函数。
传递 * 代码 * 的唯一方法是作为函数或带方法的对象。所以,如果你想用
JsonSerializable
类型参数化某个对象,并且你想创建这样一个对象,你需要传递一个工厂 * 函数沿着:你可以用以下方式来称呼它:
(If
MyClass.fromJson
是一个静态函数,而不是构造函数,你可以只写deserialize(jsonString, MyClass.fromJson)
,但Dart还没有构造函数的撕裂)。mkshixfv2#
正如接受的答案中所建议的,我最终创建了一个
Serializer<T>
类型,它由每个类的序列化器实现:事实证明,这比直接在类上使用
toJson
/fromJson
有几个好处:String
或Flutter的Color
,在这些类中您不能仅仅添加fromColor
构造函数。代码示例:
然后还将序列化器传递给需要它的代码:
显然,不能将无法序列化的对象传递给代码,因为该方法需要
Serializer<T>
。46qrfjad3#
下面是一个使用Firestore DocumentSnapshot对象的抽象方法,其中factory作为
Function
(引用)参数传递。* 感谢之前的回答 *基础类: