是否可以强制一个类使用已定义的函数签名来实现工厂函数?我尝试使用抽象接口类来完成此操作,但问题是,它需要默认实现,这意味着,在新类中实现接口时,不会出现使用默认实现的警告(在本例中为只是一个未实现的错误)。
我在一篇帖子下发现一条评论提到这是不可能的,但我想确定一下,也许知道其背后的原因: flutter/dart 上抽象类中的工厂方法
示例:
abstract class BulkFetchable {
Map<String, dynamic> toJson(); //this works nicely
factory BulkFetchable.fromJson(Map<String, dynamic> json); //this is not allowed
static String get endpoint; //sidenote, this also doesn't work
}
所以工作版本看起来像这样:
abstract class BulkFetchable {
static String get endpoint => "";
Map<String, dynamic> toJson();
factory BulkFetchable.fromJson(Map<String, dynamic> json) {
throw UnimplementedError();
}
}
但在这种情况下,实现该接口的类只能强制实现该方法,而无需默认实现。
class A implements BulkFetchable {
@override
Map<String, dynamic> toJson() {
throw UnimplementedError();
}
}
还有其他方法可以实现此功能(强制类实现 JsonSerialized 生成的函数)吗?
不,Dart 不提供强制类实现任何静态成员或构造函数的方法。无论如何,这并不重要,因为您无法以允许您调用这些方法的方式对类进行抽象。
工厂不是实例方法,它不是类接口的一部分,并且它不能是抽象的。它的访问更像是静态成员,它也不能是抽象的。
接口成员可以是抽象的(至少在抽象类中),因为可以在子类中为“该方法”提供实现。当调用接口方法时,它将使用“延迟调度”解析为所调用对象的实际实现。 静态成员和构造函数直接解析。没有其他东西可以提供实现,因为所有引用都
直接指向静态/构造函数声明。