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()するたびに 2 回呼び出されることになりBoeingます。

于 2012-04-12T23:51:06.347 に答える
0

多くの場合、メソッドの既定の実装はスーパー クラスで提供されます。これにより、サブクラスのメソッドをオーバーライドすることで、サブクラスの動作をカスタマイズできます。たとえば、飛行機はボーイングの座席を作成する方法を知っていますか? おそらくそうではないため、サブクラスでcreateSeats () をオーバーライドして、特定のタイプのAirplaneで機能する特定の実装を提供します。

スーパークラスのコンストラクター内からcreateSeats () メソッドが呼び出されるという事実は、問題のメソッドがオブジェクトの構築時に常に呼び出されることを保証します。これは一般的な設計パターンです。テンプレート方式といいます。基本的に、結果を生成するために特定の順序で多数のメソッドの実行をカプセル化するメソッドがあります。あなたの場合、createSeats()という1つのメソッドがあります。

于 2012-04-12T23:53:56.643 に答える
0

スーパー コンストラクターの呼び出しには createSeats() メソッドの呼び出しが既に含まれているため、Boeing コンストラクターに再度含める必要はありません。

座席を作成する動作のみを変更したい場合は、そのメソッドをオーバーライドしてください。

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

私は@milkplusvellocetの答えに同意しますが、「問題は createSeats() が両方のクラスの別のメソッドであるが、ボーイングはメインのメソッドをオーバーライドする必要があることです」とも言いました。自分のメソッドではなくスーパークラスのメソッドを呼び出す必要がある場合は、いつでも を呼び出すことができますsuper.createSeats()。そうすれば、スーパークラスのメソッドと独自のメソッドをいつでも区別できます。

ただし、それはほとんどの場合、オーバーライドしているメソッドで使用されます。例えば、

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

@オーバーライド

オーバーライドしたいメソッドが仕事をする前に

于 2012-04-12T23:53:56.253 に答える