【问题标题】:Inheritance and methods继承和方法
【发布时间】:2012-04-25 09:02:19
【问题描述】:

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

这是基本类的构造函数:

    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() 方法的情况下工作?

【问题讨论】:

  • 如果您在波音公司创建了一个新方法createSeats(),那么它将覆盖来自Airplane 的方法。你想做什么?
  • 为什么不能按照你的方式工作?
  • 不调用 super(x,y,width) 调用 createSeats();也在构造函数中?
  • @JA3N:试试简单的 System.out.print ...

标签: java inheritance methods constructor


【解决方案1】:

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

如果您只想要特定的子类,例如Boeing 在构造时调用 createSeats() 然后您可以将调用留在 Boeing 构造函数中并从 Airplane 中删除。

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

【讨论】:

  • 所有的类和子类都需要createSeats()方法,就是波音的createSeats()方法覆盖了Airplane的方法
  • 如果是这种情况,则将其从子类构造函数中删除。覆盖方法将在超类 constrictor 中调用。
  • @JA3N 没关系。如果Boeing 覆盖了Boeing.createSeats(),则调用Airplane.createSeats() 将调用Boeing.createSeats()。所以效果是一样的。如果您想从覆盖的方法中调用Airplane.createSeats(),请参阅我的回答。
【解决方案2】:

对超级构造函数的调用已经包含了对 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()
  }
}

【讨论】:

    【解决方案3】:

    @Override

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

    【讨论】:

    • 这只是提供了一个编译时检查,注解的方法覆盖了一些超类方法。它不会以任何方式改变行为。
    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

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

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

      @Override
      public void createSeats() {
        doSomethingSpecial();
        super.createSeats();
      }
      

      【讨论】:

        猜你喜欢
        • 2021-08-22
        • 2014-10-04
        • 2019-06-21
        • 2012-10-18
        • 1970-01-01
        • 2017-01-07
        • 2011-02-27
        • 2010-11-20
        • 2017-03-16
        相关资源
        最近更新 更多