恐怕事情不是按照你想的那样进行的.
构造函数不是接口的一部分.他们的行为更像是静电会员.
因此,您不能将工厂添加到接口,并且在给定扩展此类型的类型变量的情况下,代码将无法调用工厂构造函数.
因此,由于构造函数不能是接口的一部分,所以构造函数也不能是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还没有构造函数).