[英]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.