2016-02-12 26 views
3

我想分類車輛,但我不知道什麼是最好的方式來做到這一點。如何分類車輛 - 繼承與接口

我爲什麼困惑? 如果你想想看,汽車可在多種方式分類:

1)自然車輛:陸用車,船舶&飛機。 2)歸類的另一種方式:動力汽車和非動力車輛喜歡拖拉機(非供電,只是附加有卡車),卡車等車輛的 3)載重性質:車輛可以被加載或沒有。讓我舉一個例子: 車輛 - >陸地車輛 - >動力/非動力 - >可加載/不可加載。

如果你看到,我創造了很多子類,但什麼它使用比其他財產的區別在於它是可加載與否。我也可以使用接口來做到這一點。實現可裝載的可供載入的車輛接口。

例如: 車輛 - > LandVehicle - >拖拉機 LandVehicle將實施像isPowered和isLoadable,這將通過作爲拖拉機虛實RESP被重寫接口。

我知道,繼承是爲「我能行」,「ISA」的關係和接口,但是如何使區別就在這裏,因爲它可以互換使用。

什麼是解決此類問題的最佳途徑。

+1

解決這些問題的最好方法是使用*組合*而不是繼承*。有人可能會針對您的具體問題編寫答案,但請參閱:http://stackoverflow.com/questions/49002/prefer-composition-over-inheritance –

+0

感謝WW。我不認爲這個作品可以幫助我,或者我可能需要再考慮一下,如果這真的有幫助。 – user3089214

+0

多個屬性+屬性的多個組合== Decorator模式。 – dbugger

回答

1

來解決這類問題的最好辦法是使用KISS規則:保持簡單愚蠢!

在這種情況下,對分類中的「主要」部門使用繼承,並在分類中使用「次要」部門的接口。這是因爲Java的只允許單繼承司主要),但把上的接口次要分部)的類可以實現數量沒有限制。

然而,如果你尋求增加行爲,爲每個類別,只是希望Vehicle的一些描述,使用的組合物做類似:

public class Vehicle { 
    private List<VehicleDescription> descriptions = new ArrayList<VehicleDescription>(); 

    public void addDescription(VehicleDescription description) { 
     descriptions.add(description); 
    } 

    public boolean hasDescription(VehicleDescription description) { 
     return descriptions.indexOf(description) > -1; 
} 

public enum VehicleDescription { 
    Land, Water, Air, Powered, NonPowered, Loadable, NonLoadable 
} 

您可以添加儘可能多的「描述」類型的枚舉在您的車輛類中列出(因此您可以防止像加載& NonLoadable這樣的事情),並且您只需要幾個類!

總之,儘可能使用成分。

1

難道這些Vehicles通過能力屬性有什麼不同?

  1. 屬性:使用Builder_pattern建立不同類型的具有不同屬性的車輛。

  2. 功能:使用接口提供不同的功能,並定義Decorator以添加功能。

如果你需要同時使用這兩者,正確使用Builder + Decorator模式。

您可以使用Composite_pattern獲取Vehicle類的功能列表。 Vehicle類將保持List <Capability>

看一看這些例子:

Keeping builder in separate class (fluent interface)

When to Use the Decorator Pattern?

0

組成你的情況相符更好。想象一下,您的車輛由點火系統,燃油系統,變速箱,駕駛室等部件組成。您可以看到許多類型具有獨特的組件:2,3,4輪,履帶,懸停/正轉,rwd,awd /燃燒發動機燃料系統的意思)或電力(電力系統)。繼承會使你的架構非常受限制,難以修改。

隨着作文,你甚至不需要分類你的車輛。只需向他們添加組件。如果您希望使用過濾器來搜索車輛,例如車輪數量,變頻器類型 - 您可以使用接受標準並查找其車輛組件的方法來實現ISearchable接口,無論它們是否都符合標準。