gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 12:20:05 27 4
gpt4 key购买 nike

情况如下:

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)出现错误:

The generative constructor expected, but factory found



我的第一个想法是为 C 类创建构造函数,我会为 A 调用工厂构造函数。有可能吗?

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

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

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

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

谢谢你。

德米特里。

最佳答案

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

  • 使工厂构造函数成为命名工厂构造函数并添加普通构造函数


  • 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

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

    关于interface - 如何使用工厂构造函数扩展抽象类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29334843/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com