抽象参数构造函数

时间:2017-10-15 13:56:09

标签: java oop inheritance abstract

我想将常用的设置逻辑推迟到抽象类。公共设置逻辑是参数化的。我对它进行了摆动并制作了一个抽象构造函数:

public abstract class CondimentDecorator extends Beverage {
  protected Beverage beverage;

  public CondimentDecorator(Beverage beverage) {
    this.beverage = beverage;
  }
...

上面这个类的具体内容看起来像这样:

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

添加一个接受Beverage并调用super(饮料)的构造函数可以进行编译。我的问题是:

为什么Java在编译时看不到我对超类的构造函数非常满意并且编写public ConcreteClass(Beverage bev) {super(bev)}是浪费时间?

奖励积分为我展示了实现这一目标的方法:)

修改:有人认为这是Why default constructor is required in a parent class if it has an argument-ed constructor?的副本 相关部分是:

  

如果您没有明确指定构造函数(如B),Java编译器将为您创建一个无参数构造函数:

B()
{
    super();
}

感谢您指出这一点。即使这个问题确实揭示了 no-arg 构造函数实际发生的事情,但这个问题肯定不是重复的。 我仍然坐在这里思考:为什么java编译器不能看到父类已经有一个arg构造函数,并以类似于no-arg的方式为子类生成一个? 它真的不像一个膨胀的语言功能吗?

2 个答案:

答案 0 :(得分:0)

您已为超类定义了1个参数构造函数。你没有像这样的非参数构造函数:

public CondimentDecorator() {// do something}

由于您的Soy类默认继承了CondimentDecorator构造函数,因此它只会继承带有参数的构造函数(因此警告没有参数)。您将需要手动提供一个非参数构造函数,就像我上面所示,以便编译代码。

答案 1 :(得分:0)

默认情况下,Java为您提供default constructor(不带参数)...但是当您添加任何新构造函数时,此默认构造函数将消失。 因此,初始化超类的唯一方法是调用自己的构造函数 你的子类应首先调用你的超类的构造函数(初始化超类的字段等),然后再调用它的字段...