2013-06-20 38 views
2

在Java中的集合,我們可以有(假設額外的構造方法等):子類爲類

class Car 
{ 
    public void Vrooom() { System.out.print("Vrooom!"); } 
} 

class Prius extends Car 
{ 
    public void Vrooom() { System.out.print("..."); } 
} 

class Cars extends Car 
{ 
    private ArrayList<Car> mCars; 
    public void Vrooom() { for(Car car: mCars) car.Vrooom(); } 
} 

我遇到的代碼來了做這樣的事情,但Cars不覺得我的權利,如它必須覆蓋每一個Car方法來添加for循環。這是一種反模式,如果是這樣,爲什麼我不應該這樣做?

+2

繼承應該表示一個is-a關係。你通常不會說一系列的汽車是一輛汽車。 –

+0

我同意@VaughnCato,通常你會從一個數組類型(或任何等價的java類)擴展你的'Cars'類,或者只是在它的位置使用一個通用列表(如果你不需要一個強類型的類)用輔助方法鍵入表示等)。此外,爲什麼你*不應該*做到這一點,通過擴展'Car',沒有什麼能阻止你將'Cars'添加到你的列表中。畢竟,你說的是「汽車是汽車」。 – Joshua

回答

2

您是繼承汽車代表汽車列表?你不需要這樣做。如果你只是想汽車的名單,那麼你就可以創建

List<Car> list = new ArrayList<Car>(); 

繼承意味着子類應該通過IS-A超類和你的情況的測試,汽車的名單是不完全一輛車。

+0

謝謝,「IS-A」是我正在尋找的表達方式 - 我準備幻燈片來描述爲什麼代碼庫很糟糕,所以我會補充一點。 –

2

你說得對,有些事情感覺不對。在我看來,object的集合不應該延伸object

這可能是因爲你必須擁有一些汽車經銷店的情況,但我認爲你會是這樣做(我做的不是Java,所以我可能搞砸你的語法小):

class Dealership extends Businesses 
{ 
    private private ArrayList<Car> sellableCars; 

    public void itsAHugeSalesSpectacular() { 
     for(Car car: sellableCars) car.Vrooom(); 
    } 
} 

但根據我的經驗,沒有理由將自己的經銷商的汽車定義爲一個對象。