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

Tom*_*ell 3 polymorphism factory interface-implementation dart

我有一个抽象超类,带有一个返回子类实例的工厂。是否有可能有一个仅在超类中实现的方法?例如,在下面的代码中,是否可以删除 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());
}
Run Code Online (Sandbox Code Playgroud)

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

lrn*_*lrn 5

要从Elementin继承功能Wind,您需要扩展或混合Elementin Wind。仅仅实现一个接口不会继承任何实现。

所以,你需要有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");
}
Run Code Online (Sandbox Code Playgroud)

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

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

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");
}
Run Code Online (Sandbox Code Playgroud)

想要子类的生成构造函数和在接口/骨架类中生成默认实现的工厂构造函数是一个常见的问题。和接口存在这个问题,并通过暴露和解决了这个List问题。我认为当您将超类公开给其他库中的其他用户时,这是最好的解决方案。如果它仅由您自己内部使用,我将在超类中使用私有/非默认命名的生成构造函数。MapListBaseMapBase