[英]UML diagram for template inheritance
在我的庫的一個文件中,我有一個繼承自模板的 class。
我的代碼示例:
class data{ ... };
class dataA: public data{ ... };
class dataB: public data{ ... };
//inheritance from a template
template<typename dataHandler>
class myClass: public dataHandler{ ... };
我的代碼中的模板dataHandler
可以是data
、 dataA
或dataB
。
我想為 class myClass
編寫一個 UML 圖,以明確 inheritance 來自先前的數據類型。
似乎它不能在 UML 中完成。 根據UML 規范,
Class
是一種EncapsulatedClassifier
分類器 - 第 11.4 條EncapsulatedClassifier
是一種StructuredClassifier
- 第 11.3 條StructuredClassifier
是一種Classifier
器 - 第 11.2 條Classifier
器是一種TemplateableElement
- 第 9.2 節TemplateableElement
是一種Element
- 第 7.3 節因此Class
不是一種TemplateParameter
(第 7.3 節),而dataHandler
是TemplateParameter
的一個實例,而myClass
是Class
的一個實例。
您遇到的問題與 UML 處理用綁定元素替換模板參數的方式有關。 這主要是由符號而不是 inheritance 引起的。
事實上,如果你有一個只有組合的myClass
:
template<typename T>
class myClass {
T a;
vector<T> v;
...
};
using myClassDataA = myClass<dataA>;
您可以在 UML 中以自包含的方式表示它,模板參數僅在模板 class 中使用:
但據我所知,如果您想將 T 屬性顯示為關聯端,則無法模板化相同 class 的等效表達式:
對於 inheritance,同樣的問題:繼承的 class 在模板 class 之外。 但是在這里,沒有可以神奇地將其包含在模板框中的符號快捷方式。
如果它主要用於 C++ 設計的圖形通信,您可以直觀地建議一組類都依賴於相同的模板參數。 在我上面的作文示例中,它看起來像:
對於您的 inheritance 情況,它將是:
但請記住, UML 中沒有為此定義語義。 例如,沒有任何東西可以讓 UML 工具識別myClass<dataA>
的所有成員,這些成員將從dataA
繼承。 換句話說,沒有 UML 代碼生成器或工具能夠產生對模型有意義的東西,但是 C++ 程序員會完全理解你的意思。
雖然您的模板構造非常強大,但它也很容易出錯,因為您可以對同一模板的實例化執行的操作取決於綁定。 這意味着對於模板的每個實例化,您都需要不同的測試用例。
所以值得提醒的是一般原則:
因此,只需在您的模板 class 中創建一個dataHandler
成員,並將所有處理程序應該通用的一組良好識別的操作轉發給該成員。 然后,您可以毫無困難地使用現有的 UML 語義在 UML 中 model 它。
我知道,它不是那么靈活; 但我認為操作轉發的小麻煩,將為您節省以后的很多麻煩。 如果您確實需要更大的靈活性,您還可以考慮使用 CRTP反轉 inheritance,但這次使用更清晰和明確的 UML 建模。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.