0

我对类和子类的构造函数(扩展第一个类)有问题

这是基本类的构造函数:

    public Airplane(int x, int y, int width)
    {
        this.x = x;
        this.y = y;
        this.width = width;
        createSeats();
    }

这是另一个类的构造函数,它扩展了基本类

public Boeing(int x, int y, int width)
{
    super(x,y,width);
    createSeats();
}

问题是这createSeats()是两个类中的另一种方法,但Boeing必须覆盖主要方法。我怎样才能使它能够在不采取该createSeats()方法的情况下工作?

4

5 回答 5

1

如果您知道您希望所有子类在构造Airplane时调用createSeats(),那么您可以将调用留在Airplane构造函数中并从Boeing.

如果您只想要特定的子类,例如Boeing调用createSeats()构造,那么您可以将调用留在Boeing构造函数中并从Airplane.

不需要在两个构造函数中进行调用,将它们留在那里将导致createSeats()每次Boeing初始化都会被调用两次。

于 2012-04-12T23:51:06.347 回答
0

对超级构造函数的调用已经包含对 createSeats() 方法的调用,因此您不必在波音构造函数中重新包含它。

如果您只想更改创建座位的行为,只需覆盖该方法即可。

class Airplane {
  public Airplane(int x, int y, int width)
  {
    this.x = x;
    this.y = y;
    this.width = width;
    createSeats();
  }

  void createSeats() { /* create them */ }
}
class Boeing {
  public Boeing(int x, int y, int width)
  {
    super(x,y,width); // same steps as super class
  }

  @Override
  void createSeats()
  {
    // do something else entirely
    // possibly call super.createSeats()
  }
}
于 2012-04-12T23:51:45.460 回答
0

通常在超类中提供方法的默认实现,它允许您通过覆盖子类中的方法来自定义子类中的行为。例如,飞机是否知道如何在波音上创建座位?可能不会,因此您将覆盖子类中的createSeats () 以提供适用于您特定类型Airplane的特定实现。

从超类的构造函数内部调用createSeats () 方法这一事实保证了在构造对象时始终会调用所讨论的方法。这是一种常见的设计模式。它被称为模板方法。基本上,您有一个方法可以按特定顺序封装许多方法的执行以产生结果。在您的情况下,有一种方法,即createSeats ()。

于 2012-04-12T23:53:56.643 回答
0

我同意@milkplusvellocet 的回答,但是您也说“问题是 createSeats() 是两个类中的另一种方法,但波音必须覆盖主要方法。” 如果您需要调用超类的方法而不是您自己的方法,您可以随时调用super.createSeats(). 这样,您始终可以区分超类中的方法和您自己的方法。

但是,也就是说,这几乎总是在您覆盖的方法中使用。例如,

@Override
public void createSeats() {
  doSomethingSpecial();
  super.createSeats();
}
于 2012-04-12T23:57:05.783 回答
-2

@覆盖

在您要覆盖的方法应该完成工作之前

于 2012-04-12T23:53:56.253 回答