当包含工厂方法时如何访问抽象超类实现?

How to access abstract superclass implementation when it contains a factory method?

我有一个带有工厂的抽象超类,returns 是一个子类的实例。是否可以有一个只在超类中实现的方法?例如,在下面的代码中,是否可以删除 Wind::act()?

abstract class Element {
  final String action;    // what it does
  String act() => action; // do it

  factory Element() {
    return new Wind();
  }
}

class Wind implements Element {
  final action = "blows";
  act() => action;  // Why is this necessary?
}

void main() {
  print(new  Element().act());
}

删除 Wind::act() 时,出现缺少它的错误。此外,当扩展而不是实现超类时,遗漏子类实现不会导致错误。但是对于工厂方法,扩展不是一个选项。

要从 Wind 中的 Element 继承功能,您需要扩展或混入 Wind 中的 Element。仅仅实现接口不会继承任何实现。

因此,您需要class Wind extends Element { ... }。 这目前是不可能的,因为 Element 没有 Wind 可以用作超级构造函数的生成构造函数。因此,您也需要添加它,并确保在该构造函数中初始化 action 字段。

class Element {
  final String action;
  Element._(this.action);    // Generative constructor that Wind can use.
  factory Element() = Wind;  // Factory constructor creating a Wind.
  String act() => action;
}
class Wind extends Element {
  Wind() : super._("blows");
}

生成构造函数不需要是私有的,但如果您只在自己的库中声明和使用所有 classes,它也可能是私有的。

另一种选择是有一个单独的 ElementBase class 包含 action 字段和 act 函数以及一个空名的生成构造函数。在这种情况下,mixins 不是一个好的选择,因为当 mixins 不能有构造函数时,没有好的方法使 action 最终化。

abstract class Element {
  String get action;
  factory Element() = Wind;
  String act();
}
class ElementBase implements Element {
  final String action;
  ElementBase(this.action);
  String act() => action;
}
class Wind extends ElementBase {
  Wind() : super("blow");
}

需要子classes 的生成构造函数和在interface/skeleton class 中生成默认实现的工厂构造函数是一个常见问题。 ListMap接口有这个问题,通过暴露ListBaseMapBase解决了。当您将 superclass 公开给其他库中的其他用户时,我认为这是最好的解决方案。如果只是自己内部使用,我会在superclass.

中使用private/non-default-named生成构造函数