【问题标题】:How to extend an abstract class with factory constructor?如何使用工厂构造函数扩展抽象类?
【发布时间】:2015-06-02 19:08:27
【问题描述】:

情况如下:

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。这些说法正确吗?

谢谢。

德米特里。

【问题讨论】:

    标签: interface dart abstract-class


    【解决方案1】:

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

    • 使工厂构造函数成为命名工厂构造函数并添加普通构造函数
    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

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

    【讨论】:

    • 另外,当然,“B类实现了A{...}。那么你可以说,“B b = new A()”?
    • @TomRussell 不,你不能那样做。这条线有两个问题。 1.你不能使用像A()这样的构造函数来实例化一个抽象类。 2. 即使它是一个具体的类,你仍然不能这样做,因为不能将A 的实例分配给B,尽管反过来也是如此,即A a = B()
    • @Günter,我在最新的 Dart SDK 中不再看到该错误。您不需要为此创建任何虚拟构造函数。如果你没有维护你的 Dart 答案,你可以忽略这个评论。但如果你是,那么我想知道我做错了什么。这是Dartpad上的代码。
    • 我认为没有任何改变。我需要看一个完整的例子来了解你的情况。
    • @iDecode 我不记得看到过这个错误,但可能是一个错误。感谢 Dartpad,我错过了链接。对不起。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-26
    • 2019-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-13
    • 2021-06-02
    相关资源
    最近更新 更多