Dart:是否可以使工厂方法多态?

jas*_*xir 1 polymorphism inheritance dart

是的,它与 JSON 反序列化有关。我有课JsonStringSerializable

abstract class JsonStringSerializable {
  Map<String, dynamic> toJson();
}
Run Code Online (Sandbox Code Playgroud)

我可以扩展

class Cat extends JsonStringSerializable {

  @override
  Map<String, dynamic> toJson() => null;

  factory Cat.fromJson(Map<String, dynamic> json) => null;
}
Run Code Online (Sandbox Code Playgroud)

所以现在我可以使用 的任何实例JsonStringSerializable并期望 的实现toJson

我的问题是我怎样才能做同样的事情fromJson在Dart中可能吗?

lrn*_*lrn 5

不。

工厂构造函数、生成构造函数或静态方法不是任何接口的一部分。这意味着您无法使用类型对它们进行抽象。没有“具有构造函数或静态方法的东西”的类型。toJson(Map<String,dynamic>)

您可以做的一件事就是对函数本身进行抽象。

T createFromJson<T>(T fromJson(Map<String, dynamic> json), Map<String, dynamic> json) =>
  fromJson(json);
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用调用构造函数的函数来调用该函数(或者如果您使用静态方法,则直接删除该方法):

  createFromJson((map) => Cat.fromJson(map), json);
Run Code Online (Sandbox Code Playgroud)