gpt4 book ai didi

dart - 当包含工厂方法时如何访问抽象父类(super class)实现?

转载 作者:行者123 更新时间:2023-12-03 02:53:44 27 4
gpt4 key购买 nike

我有一个抽象父类(super class),它有一个返回子类实例的工厂。是否可以有一个只在父类(super class)中实现的方法?例如,在下面的代码中,是否可以删除 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());
}

当删除 Wind::act() 时,有一个关于它丢失的错误。此外,当扩展而不是实现父类(super class)时,遗漏子类实现不会导致错误。但是对于工厂方法,扩展不是一种选择。

最佳答案

要从 Wind 中的 Element 继承功能,您需要在 Wind 中扩展或混合 Element。仅仅实现接口(interface)不会继承任何实现。

因此,您需要有 class Wind extends Element { ... }。这目前是不可能的,因为 Element 没有 Wind 可以用作 super 构造函数的生成构造函数。因此,您也需要添加它,并确保在该构造函数中初始化 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");
}

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

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

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");
}

既需要子类的生成构造函数,又需要在接口(interface)/骨架类中生成默认实现的工厂构造函数,这是一个常见的问题。 ListMap接口(interface)有这个问题,通过暴露ListBaseMapBase解决了。当您将父类(super class)公开给其他库中的其他用户时,我认为这是最好的解决方案。如果它仅由您自己在内部使用,我将在父类(super class)中使用私有(private)/非默认命名的生成构造函数。

关于dart - 当包含工厂方法时如何访问抽象父类(super class)实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33664975/

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