Tom*_*ell 3 polymorphism factory interface-implementation dart
我有一个抽象超类,带有一个返回子类实例的工厂。是否有可能有一个仅在超类中实现的方法?例如,在下面的代码中,是否可以删除 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());
}
Run Code Online (Sandbox Code Playgroud)
删除 Wind::act() 时,出现缺少它的错误。此外,当扩展而不是实现超类时,省略子类实现不会导致错误。但对于工厂方法,扩展不是一种选择。
要从Elementin继承功能Wind,您需要扩展或混合Elementin Wind。仅仅实现一个接口不会继承任何实现。
所以,你需要有class Wind extends Element { ... }. 目前这是不可能的,因为Element没有Wind可以用作超级构造函数的生成构造函数。因此,您还需要添加它,并确保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");
}
Run Code Online (Sandbox Code Playgroud)
生成构造函数不需要是私有的,但如果您仅在自己的库中声明和使用所有类,那么它也可能是私有的。
另一种选择是拥有一个单独的ElementBase类,其中包含action字段和act函数以及一个空命名的生成构造函数。action在这种情况下,Mixin 不是一个好的选择,因为当 mixins 不能有构造函数时,没有好的方法可以使其成为最终的。
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");
}
Run Code Online (Sandbox Code Playgroud)
想要子类的生成构造函数和在接口/骨架类中生成默认实现的工厂构造函数是一个常见的问题。和接口存在这个问题,并通过暴露和解决了这个List问题。我认为当您将超类公开给其他库中的其他用户时,这是最好的解决方案。如果它仅由您自己内部使用,我将在超类中使用私有/非默认命名的生成构造函数。MapListBaseMapBase
| 归档时间: |
|
| 查看次数: |
1423 次 |
| 最近记录: |