Java 抽象参数构造函数
我想将公共设置逻辑推迟到抽象类。通用设置逻辑是参数化的。我试了一下,做了一个抽象构造器:Java 抽象参数构造函数,java,oop,inheritance,abstract,Java,Oop,Inheritance,Abstract,我想将公共设置逻辑推迟到抽象类。通用设置逻辑是参数化的。我试了一下,做了一个抽象构造器: public abstract class CondimentDecorator extends Beverage { protected Beverage beverage; public CondimentDecorator(Beverage beverage) { this.beverage = beverage; } ... 上述类的具体impl如下所示: public cl
public abstract class CondimentDecorator extends Beverage {
protected Beverage beverage;
public CondimentDecorator(Beverage beverage) {
this.beverage = beverage;
}
...
上述类的具体impl如下所示:
public class Soy extends CondimentDecorator {
public String getDescription() {
return beverage.getDescription() + ", Soy";
}
....
这是不可编译的。我得到:
public class Soy extends CondimentDecorator {
^
required: Beverage
found: no arguments
reason: actual and formal argument lists differ in length
添加一个接受饮料并调用super(饮料)的构造函数可以编译此文件。我的问题是:
为什么Java在编译时看不到我对超类的构造函数非常满意,而编写public-ConcreteClass(bev){super(bev)}
是浪费时间呢
向我展示实现此目标的方法的奖励积分:)
编辑:有人建议这是
相关部分如下:
如果不显式指定构造函数(如B中所示),Java编译器将为您创建一个无参数构造函数,如下所示:
public class Soy extends CondimentDecorator {
public String getDescription() {
return beverage.getDescription() + ", Soy";
}
....
谢谢你指出这一点。即使这个问题确实说明了在没有arg构造函数的情况下实际会发生什么,但这个问题肯定不是重复的。
我仍然坐在这里思考:为什么java编译器不能看到父类已经有一个arg构造函数,并以与无arg构造函数类似的方式为子类生成一个arg构造函数?
它看起来真的不像是一个很棒的语言特性吗?您已经为超类定义了一个单参数构造函数。您没有这样的无参数构造函数:
public CondimentDecorator() {// do something}
默认情况下,由于您的Soy类继承了consumentdecorator构造函数,因此它将只继承带有参数的构造函数(因此警告不要使用参数)。您需要手动提供一个非参数构造函数,如我上面所示,以使您的代码能够编译。Java默认为您提供一个
默认构造函数(无参数)…但当您添加任何新构造函数时,此默认构造函数将消失。
因此,初始化超类的唯一方法是调用自己的构造函数。
你的子类应该首先调用你的超类的构造函数(初始化超类的字段等等),然后调用它的字段…你不必提供一个没有参数的构造函数,在他的情况下,他可能不希望这样。就我个人而言,我喜欢expilcit编码风格,我很高兴花5秒钟让Eclipse生成您想要的构造函数。看到一个新的ConcreteClass(beverage)
之后,我直接找到了这个构造函数的定义,而你的建议让我在层次结构中寻找有效的定义。我完全同意你明确的编码风格。但是,我认为您可以很快地查看一个类,看到它没有构造函数,然后在层次结构中向上看,就像您看到它有一个简单的super()构造函数一样