簡體   English   中英

繼承和方法

[英]Inheritance and methods

我的類和子類的構造函數有問題(擴展了第一個類)

這是基本類的構造函數:

    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()方法呢?

如果您知道要讓Airplane所有子類在構造時調用createSeats() ,則可以將該調用保留在Airplane構造函數中,並從Boeing刪除。

如果只希望特定的子類,例如Boeing在構造時調用createSeats() ,則可以將該調用保留在Boeing構造函數中,然后從Airplane刪除。

不需要這兩個構造函數中的調用,將它們保留在那里將導致createSeats()對於您初始化的每個Boeing都被調用兩次。

對超級構造函數的調用已經包括對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()
  }
}

通常,在超類中提供方法的默認實現,該方法使您可以通過重寫子類中的方法來自定義子類中的行為。 例如, 飛機是否知道如何在波音 飛機上制造座位? 可能不是,因此您將重寫子類中的createSeats ()以提供適用於您特定類型的Airplane的特定實現。

從您的超類的構造函數內部調用createSeats ()方法的事實保證了始終在對象的構造上調用該方法。 這是一種常見的設計模式。 這稱為模板方法。 基本上,您有一個方法以某種順序封裝了許多方法的執行以產生結果。 在您的情況下,有一種方法稱為createSeats ()。

我同意@milkplusvellocet的回答,但是您還說過“問題是createSeats()是這兩個類中的另一種方法,但波音必須重寫主要方法。” 如果您需要調用超類的方法而不是自己的方法,則可以始終調用super.createSeats() 這樣,您始終可以區分超類中的方法和您自己的方法。

但是,那幾乎總是在您要覆蓋的方法中使用。 例如,

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

@Override

在您要覆蓋的方法應做的工作之前

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM