簡體   English   中英

如何在 UML 圖中表示 C++ 私有 inheritance?

[英]How to represent C++ private inheritance in an UML diagram?

在 C++ 中,可以通過publicprotectedprivate inheritance 創建子類。 在 UML class 圖中表示該符號的符號是什么? 我正在考慮將 label 放在箭頭上,但不確定這是否是常見做法。

C++ 中的私有 inheritance 是什么?

C++中的私有inheritance,如:

class B1 {
public: 
   void test(); 
   ...
};
class D1 : private B1 {
public:
   void demo() { test(); }
...
}; 

意味着D1的每個實例都是B1的實例,但這對外界是隱藏的。 這個奇怪的結構旨在通過重用基礎 class 的代碼來實現派生的 class,但好像沒有 inheritance。

因此,與公共 inheritance 不同,D1 object 不能用於預期 B1 object 的地方:

 B1 *p = new D1;     //ouch -> error: ‘B1’ is an inaccessible base of ‘D1’

這是 UML inheritance 嗎?

在 UML 中,當派生的 class 專門化一個更通用的基類時,它意味着以下內容:

類型一致性意味着如果一個類型符合另一個類型,那么第一個類型的任何實例都可以用作類型被聲明為第二個類型的 TypedElement 的值。 分類器是一種類型,並且符合自身及其所有概括

因此,在 UML 中,如果 D1 專門化(即繼承自)B1,則始終可以使用 D1 實例來代替 B1 object。 這與 C++ 私有 inheritance 不匹配。

而且,接口與其實現之間也不存在實現關系,因為 D1 不符合 B1 定義的接口:

BehavioredClassifier 和接口之間的 InterfaceRealization 關系意味着 BehavioredClassifier 通過支持接口擁有的一組特性及其任何父接口來遵守接口指定的合同。

如何在標准 UML 中表示它?

顯然,存在依賴關系:D1 依賴於 B1。 所以你可以簡單地顯示一個依賴。 但這並不能真正幫助把握那種關系,也不是很有用。 (除非你添加評論來解釋)

因此,更好的方法是使用 map UML 來匹配 C++ 語義。 在這方面,您可以設想 model 私有 inheritance 作為組合關系:

在此處輸入圖像描述

為什么? 因為這種情況與以下組合替代方案非常相似(盡管不完全):

class B2 {
public: 
   void test(); 
   ...
};

class D2 {
private: 
   B2 base;  // instead of private inheritance
public:
   void demo() { base.test(); }  // base members accessed via base
...
}; 

因此,我們在 UML model 中所做的就是明確說明,在任何 D1 實例中,都有一個 B1 子對象不能直接從外部世界訪問。

編輯:其他選擇?

在以前且現在已過時的 UML 1.4中,泛化關系可能具有可以滿足您的需求的刻板印象«Implementation» ,但自 2005 年以來不再受支持,並且可能會誤導一些將“實施”與接口相關聯的讀者:

指定子繼承父的實現(其屬性、操作和方法)但不公開供應商的接口,也不保證支持它們,從而違反可替代性。 這是私有的 inheritance,通常僅用於編程實現目的。

在 UML 元模型中稍微挖掘一下,似乎泛化具有isSubstitutable屬性,默認情況下該屬性為 true。 因此,您可以考慮使用自己的語言特定配置文件,並在其中定義構造型«Private inheritance»«Protected inheritance» ,用於Generalization元模型元素的專門化,兩者都使用isSubstituable=false 這將允許:

在此處輸入圖像描述

這可能是一種非常實用且易讀的方式來傳達您特定於語言的設計意圖,包括 D1 object 不能替代 B1。 但請注意,這並非沒有風險: isSubsituable僅與運行時承諾有關,實際上對 UML 中公共功能的 inheritance 規則沒有影響。 因此,自動化工具可能會得出與您的讀者不同的結論(這就是我在上面提出另一種方法的原因)。

我會說 UML 通常是它所具有的關系類型,例如一對一或一對多。 如果您從抽象 class、接口或只是另一個基礎 class 派生。 通常在 inheritance 期間,您將使用受保護的關鍵字,以便所有內容對於 inheritance 之外的任何 class 都是私有的。 從基礎 class 繼承后,您還可以覆蓋基礎 class 的方法,以及從覆蓋的方法內部運行基礎方法。

我相信您在這里尋找的是受保護的關鍵字,它基本上是私有的 inheritance。 只有相關的類才能訪問這些成員。 例如,您創建具有受保護成員的基 class,然后在繼承的類或派生自基的類中使用這些成員。 這里有更多信息https://www.tutorialspoint.com/cplusplus/cpp_inheritance.htm

暫無
暫無

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

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