[英]UML:Inheritance between template classes with parameter dependencies
请原谅我糟糕的英语。 让我向您展示我试图在 UML class 图中绘制的情况。
template<typename TB1, typename TB2, typename TB3>
class Base { ... };
template<typename TD1, typename TD2>
class Derived : public Base<typename TD1, typename TD2, int> { .... };
我知道当 class 继承泛型 class 时如何绘制 UML class 图,如下所示( 之前问过类似的问题)。
但是如果派生类的模板参数类型设置了基类的模板参数类型怎么办? 只需添加另一个箭头指示绑定类型取决于派生类的模板参数?
您可以使用参数绑定(如您的图片,但在两个模板类之间)或模板类之间的 inheritance 来显示模板Base
和模板Derived
之间的关系。
但是,对于 C++ 和 UML 语义,这两种选择都不完全准确。 为此,您需要将模板 inheritance 分解为一个绑定和一个 inheritance。
Derived
和Base
之间的 C++ 泛化同时做了三件事:
Base
模板 class 的参数(即用TD1
代替TB1
,用TD2
代替TB2
,用int
代替TB3
);TD1
和TD2
在生成的绑定 class 中保持可替换;对于C++不太熟悉的读者,我们用别名来说明一下:
template<typename TB1, typename TB2, typename TB3>
class Base { };
template<typename TD1, typename TD2>
class Derived : public Base<TD1, TD2, int> { };
int main() {
using MyDerived = Derived<string, Test>; // class corresponding to binding parameters
using MyBase = Base<string, Test, int>; // also binding parameters
MyBase *p = new MyDerived(); // this assignment works because the bound
// MyBase generalization is a generalization
// from MyDerived
}
所以这段代码意味着有一个从Base
到Derived
的通用特化,这是正确的,无论参数绑定如何,特别是对于绑定的MyBase
和MyDerived
。
第一种可能性是在模板类之间简单地使用<<bind>>
:
UML 规范,第 9.3.3.1 节:(...) 如何将内容合并到绑定元素中的详细信息保持开放状态。 (...) 绑定的分类器除了其绑定产生的内容外,还可能包含其他内容。
Derived
将是一个绑定分类器,通过绑定Base
的参数并添加“自己的内容”,包括对基本元素的重新定义(“覆盖”)。 这没有错,但不能恰当地反映出从Derived
获得的绑定类和直接从Base
获得的绑定类之间也有一个 inheritance。
另一种方法可能是模板之间的 inheritance:
对应C++语义。 但是 UML 部分9.9.3.2 Template classifier specializations为该图提供了另一种语义:
RedefinableTemplateSignature 重新定义所有作为模板的父分类器的 RedefinableTemplateSignatures。 扩展(重新定义)签名的所有正式 TemplateParameters 都包含为扩展签名的正式 TemplateParameters,以及为扩展签名本地指定的任何 TemplateParameters。
我理解这意味着模板参数增加(即集合将是TB1
、 TB2
、 TB3
、 TD1
和TD2
)并且没有语义或符号预见来定义某些父元素的本地绑定。 所以 UML 读者可能会误解设计意图。
因此,最简洁的方法是分解绑定和 inheritance(我使用了绑定 class,它本身使用新参数名称模板化以对齐,但这可能有点矫枉过正):
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.