2017-10-15 148 views
-2

我想推迟到一个抽象类的通用设置逻辑。通用设置逻辑被参数化。我挥拳它并提出一个抽象的构造函数:抽象参数构造函数

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(Beverage bev) {super(bev)}是浪费时间?用于显示我的方式来完成

加分这个:)

编辑:有人提出这是Why default constructor is required in a parent class if it has an argument-ed constructor? 相关部分的副本是这样的:

如果你不” t明确指定构造函数(如在B中)Java编译器将为您创建一个无参数构造函数,如下所示:

B() 
{ 
    super(); 
} 

感谢您指出了这一点。尽管这个问题没有什么实际上无参数的构造函数发生阐明,这个人是肯定不会重复。 我仍然坐在这里想:为什么不能Java编译器看到,父类已经有一个参数的构造函数,并产生以类似的方式对一个子类,因为它确实为无参数的呢? 它真的不像一个膨胀的语言功能?

+0

个人而言,我喜欢expilcit编码风格,我很乐意花5秒钟Eclipse会生成你想要的构造函数。看到一个“新的ConcreteClass(饮料)”,然后直接指向这个构造函数的定义,而你的建议让我在层次结构中搜索有效的定义。 –

+0

我完全同意你的显式编码风格。然而,我认为你就像看到一个类一样快,看到它有* no *构造函数,然后沿着你看到它的层次结构上升*具有*构造函数它简单地超级() – Jarvis

回答

0

,您已经定义了你的超1个参数的构造函数。你不必非参数的构造函数,像这样:

public CondimentDecorator() {// do something} 

当你的大豆类继承默认的构造函数CondimentDecorator,它将只继承了一个带参数(因此预警没有参数)。你需要手动提供一个非参数的构造函数,就像我上面显示的那样,以便编译代码。

+1

你不必提供构造函数没有任何争论,在他的情况下,他可能不希望这样。 – MCMastery

0

的Java默认给你一个default constructor(无参数)......但是当你添加任何新的构造函数,这个默认的就会消失。 所以,初始化你的超类的唯一方法是调用你自己的构造函数。
而你的子类应该首先调用你的超类的构造函数(初始化超类的字段等),然后它的字段...