当包含工厂方法时如何访问抽象超类实现?
How to access abstract superclass implementation when it contains a factory method?
我有一个带有工厂的抽象超类,returns 是一个子类的实例。是否可以有一个只在超类中实现的方法?例如,在下面的代码中,是否可以删除 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() 时,出现缺少它的错误。此外,当扩展而不是实现超类时,遗漏子类实现不会导致错误。但是对于工厂方法,扩展不是一个选项。
要从 Wind
中的 Element
继承功能,您需要扩展或混入 Wind
中的 Element
。仅仅实现接口不会继承任何实现。
因此,您需要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");
}
生成构造函数不需要是私有的,但如果您只在自己的库中声明和使用所有 classes,它也可能是私有的。
另一种选择是有一个单独的 ElementBase
class 包含 action
字段和 act
函数以及一个空名的生成构造函数。在这种情况下,mixins 不是一个好的选择,因为当 mixins 不能有构造函数时,没有好的方法使 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");
}
需要子classes 的生成构造函数和在interface/skeleton class 中生成默认实现的工厂构造函数是一个常见问题。 List
和Map
接口有这个问题,通过暴露ListBase
和MapBase
解决了。当您将 superclass 公开给其他库中的其他用户时,我认为这是最好的解决方案。如果只是自己内部使用,我会在superclass.
中使用private/non-default-named生成构造函数
我有一个带有工厂的抽象超类,returns 是一个子类的实例。是否可以有一个只在超类中实现的方法?例如,在下面的代码中,是否可以删除 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() 时,出现缺少它的错误。此外,当扩展而不是实现超类时,遗漏子类实现不会导致错误。但是对于工厂方法,扩展不是一个选项。
要从 Wind
中的 Element
继承功能,您需要扩展或混入 Wind
中的 Element
。仅仅实现接口不会继承任何实现。
因此,您需要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");
}
生成构造函数不需要是私有的,但如果您只在自己的库中声明和使用所有 classes,它也可能是私有的。
另一种选择是有一个单独的 ElementBase
class 包含 action
字段和 act
函数以及一个空名的生成构造函数。在这种情况下,mixins 不是一个好的选择,因为当 mixins 不能有构造函数时,没有好的方法使 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");
}
需要子classes 的生成构造函数和在interface/skeleton class 中生成默认实现的工厂构造函数是一个常见问题。 List
和Map
接口有这个问题,通过暴露ListBase
和MapBase
解决了。当您将 superclass 公开给其他库中的其他用户时,我认为这是最好的解决方案。如果只是自己内部使用,我会在superclass.