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

时间:2015-03-29 21:07:25

标签: interface dart abstract-class

情况如下:

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

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

class C extends A {
}

我有一个抽象类A. B类实现A.因此它会覆盖doSomething()方法。 C类扩展A。

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

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

  void doSomething() => print('Do something..');
}

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

  

预期的生成构造函数,但工厂找到了

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

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

abstract class Exception {
  factory Exception([var message]) => new _ExceptionImplementation(message);
}

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

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

谢谢。

梅德。

1 个答案:

答案 0 :(得分:4)

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

  • 使工厂构造函数成为命名工厂构造函数并添加普通构造函数
abstract class A {
  void doSomething() => print('Do something..');
  factory A.name() => new B();
  A();
}
  • 或创建名为的常规构造函数,并从扩展类
  • 中显式调用它
abstract class A {
  void doSomething() => print('Do something..');
  factory A() => new B();
  A.protected();
}

class C extends A {
  C() : super.protected();
}

尝试DartPad

你的陈述是对的。如果你实现了一个类,它就充当了一个接口,如果你扩展它,它就作为一个基类。