簡體   English   中英

組成繼承

[英]Inheritance with composition

我正在設計一個系統,但我尚未實現,我只是對其進行圖解,然后對其進行編碼,我想問一個簡單的問題:

當我們同時使用繼承和組合時該怎么辦?

例如,在旅館中,有兩種房間標准間和雙床間。 為此,我可以使用繼承概念,這兩種房間將是派生類,但是我也可以使用組合,將標准間和雙床間設為單獨的類,然后將其用作我的酒店類。

我該怎么辦?

這個問題有點含糊,缺少許多細節,但我會分享一些想法...

第一件事:在設計應用程序時,最重要的是需求

您首先需要嘗試識別將在您的系統中具有某些含義的實體。 假設您知道會有HotelRoom 請注意,此關系已經是一個組合,主要是因為:

  • 房間只能是1家酒店的一部分,不能在多家酒店之間共享
  • 一旦酒店被摧毀,里面的所有房間也都被摧毀

在C ++中,組合通常表示“按值”,即class Hotel可以有Room room; 這將是一個具有自動存儲持續時間的對象,其生命周期與Hotel實例的生命周期相關聯,如果您擁有多個房間,則可以將它們放到矢量中,以產生相同的關系:

class Room { ... };

class Hotel {
public:
    std::vector<Room> rooms;
};

(順便說一句,聚集很可能由指針或引用表示)。 這是組成的另一個很好的例子:

在此處輸入圖片說明

如果您知道會有各種房間,那么第一個問題應該是:這些物體的行為是否不同? 我的系統會以不同的方式對待他們嗎? ...也許您不需要追求比Room更細的粒度,並且具體房間的所有內容都將通過其屬性來表示-大小,床位數,也許數十個布爾型“ has”標志(“ has” aircon”,“有電視”,“有微波爐”,...),也許它的所有屬性都可以用簡單的“類型”表示,您可以將其值放入enum

如果您在站點上,我將在room類上擁有一個room_type屬性,並且將room_type屬性的類型設置為枚舉類型,並可能使用STANDARD和TWIN值。

只要根據此類型字段沒有明顯的行為差異,我就將其保持簡單。

如果存在復雜的行為,例如根據床位數預測清理,更改價格等,我將使用抽象基類CRoom,並從中繼承CStdRoom和CTwinRoom,並可能在類構造函數中設置常量num_of_beds屬性。

您不應該使用語言繼承為業務需求繼承建模。 這只是使其很難修改或擴展業務模型。 語言繼承用於實現模型的功能,而不是模型本身。

而是從“業務對象”或類似對象派生所有對象,以封裝常見的內部行為,例如序列化。 您的類可以具有類型,可以使用typeinfo,也可以使用顯式類型字段。 無論對象是繼承還是合成,對象之間的兩種鏈接都應該是指針(或索引ID字段)和集合(指針或索引ID的集合)。 [您的代碼段很好,但是指針使整數ID避免的內存管理復雜化。]

復雜的行為應屬於其他類別,例如定價,清潔等。在設置業務對象和業務動作之間的關系時,還可以使用其他模式,但也要避免使用語言功能使它們具體化。 如果系統有所增長或改變,您將后悔。

暫無
暫無

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

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