2012-04-12 156 views
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()方法呢?

+0

如果您在波音創建了一個新的'createSeats()'方法,那麼它將覆蓋'Airplane'中的一個。你在做什麼? – kba 2012-04-12 23:43:20

+0

爲什麼它不按照你的方式工作? – jahroy 2012-04-12 23:43:44

+0

不調用super(x,y,width)調用createSeats();在構造函數中呢? – JA3N 2012-04-12 23:46:38

回答

1

如果你知道你想要的Airplane所有子類調用施工createSeats()然後你可以離開中的呼叫Airplane構造,並從Boeing刪除。

如果您只想要特定的子類,例如Boeing致電createSeats()正在建設中,那麼您可以在Boeing的構造函數中留下呼叫,並從Airplane中刪除。

需要在這兩個構造函數調用次數,使他們有將導致createSeats()你初始化每個Boeing被稱爲兩次。

+0

所有類和子類都需要createSeats()方法,它是波音公司的createSeats()方法重寫了飛機中的方法 – JA3N 2012-04-12 23:55:05

+0

如果是這種情況,那麼將其從子類構造函數中刪除。覆蓋方法將在超類縮瞳中調用。 – darrengorman 2012-04-12 23:58:22

+0

@ JA3N很好。調用'Airplane.createSeats()'將會調用'Boeing.createSeats()',如果它被'Boeing'覆蓋。所以效果會一樣。如果你想從覆蓋的方法調用'Airplane.createSeats()'看到我的答案。 – 2012-04-13 00:00:09

0

對super構造函數的調用已經包含對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() 
    } 
} 
-2

@覆蓋

前要覆蓋應該做的工作

+1

這只是提供了一個編譯時檢查,註釋的方法覆蓋了一些超類的方法。它不會以任何方式改變行爲。 – darrengorman 2012-04-13 00:02:29

0

常見的方法的默認實現在一個超類提供,它允許您自定義的行爲的方法通過重寫子類中的方法來創建子類。例如。 飛機是否知道如何在波音上創建座位?可能不會,因此你會覆蓋createSeats()在你的子類提供特定的實現,適用於你的特定類型的飛機

從超類的構造函數內部調用createSeats()方法的事實可以保證在構造對象時總會調用所討論的方法。這是一種常見的設計模式。它被稱爲模板方法。基本上你有一種方法,它以一定的順序封裝了一些方法的執行,以產生一個結果。在你的情況下,有一種方法,即createSeats()。

0

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

但是,那就是說,這幾乎總是用在你重寫的方法中。例如,

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