如何使用工厂构造函数扩展抽象类?

Dmi*_*pka 6 abstract-class interface dart

情况如下:

abstract class A {
  void doSomething() => print('Do something..');
}

class B implements A {
  @override
  void doSomething() => print('Do something already..');
}

class C extends A {
}
Run Code Online (Sandbox Code Playgroud)

我有一个抽象类A.B类实现A.因此它覆盖了doSomething()方法.C类延伸A.

一切正常,直到我将工厂构造函数添加到A类:

abstract class A {
  factory A() => new B();

  void doSomething() => print('Do something..');
}
Run Code Online (Sandbox Code Playgroud)

这导致我的IDE(IntelliJ IDEA)出错:

预期的生成构造函数,但工厂发现

我的第一个想法是为C类创建构造函数,我将其称为工厂构造函数.是否可以这样做?

当我尝试扩展Exception类时,我遇到了同样的问题.它还有一个工厂构造函数:

abstract class Exception {
  factory Exception([var message]) => new _ExceptionImplementation(message);
}
Run Code Online (Sandbox Code Playgroud)

这就是为什么要创建我的自定义异常我必须实现Exception类而不是扩展它,它真的让我困惑.

我还想澄清一个术语问题.我可以说从B类的角度来看,A是一个接口,所以B正在实现接口A.但是,从C类的角度来看,A是一个抽象类,所以C是扩展抽象类A.这些语句正确?

谢谢.

梅德.

Gün*_*uer 14

如果类没有构造函数,则隐式添加生成构造函数。如果类具有显式构造函数,则不会添加生成构造函数。你有两个选择。

  • 使工厂构造函数成为命名工厂构造函数并添加一个普通构造函数
abstract class A {
  void doSomething() => print('Do something..');
  factory A.name() => new B();
  A();
}
Run Code Online (Sandbox Code Playgroud)
  • 或命名普通构造函数并从扩展类中显式调用它
abstract class A {
  void doSomething() => print('Do something..');
  factory A() => new B();
  A.protected();
}

class C extends A {
  C() : super.protected();
}
Run Code Online (Sandbox Code Playgroud)

试试DartPad

你的说法是对的。如果你实现一个类,它充当接口,如果你扩展它,它充当基类。