繁体   English   中英

UML:Inheritance 模板类之间有参数依赖

[英]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。

更多解释

您的 C++ 代码是什么意思?

DerivedBase之间的 C++ 泛化同时做了三件事:

  • 它绑定了Base模板 class 的参数(即用TD1代替TB1 ,用TD2代替TB2 ,用int代替TB3 );
  • 它使TD1TD2在生成的绑定 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
}

所以这段代码意味着有一个从BaseDerived的通用特化,这是正确的,无论参数绑定如何,特别是对于绑定的MyBaseMyDerived

如何在UML中显示它?

选项 1 - 绑定

第一种可能性是在模板类之间简单地使用<<bind>>

UML 规范,第 9.3.3.1 节:(...) 如何将内容合并到绑定元素中的详细信息保持开放状态。 (...) 绑定的分类器除了其绑定产生的内容外,还可能包含其他内容。

Derived将是一个绑定分类器,通过绑定Base的参数并添加“自己的内容”,包括对基本元素的重新定义(“覆盖”)。 这没有错,但不能恰当地反映出从Derived获得的绑定类和直接从Base获得的绑定类之间也有一个 inheritance。

选项 2 - inheritance

另一种方法可能是模板之间的 inheritance:

在此处输入图像描述

对应C++语义。 但是 UML 部分9.9.3.2 Template classifier specializations为该图提供了另一种语义:

RedefinableTemplateSignature 重新定义所有作为模板的父分类器的 RedefinableTemplateSignatures。 扩展(重新定义)签名的所有正式 TemplateParameters 都包含为扩展签名的正式 TemplateParameters,以及为扩展签名本地指定的任何 TemplateParameters。

我理解这意味着模板参数增加(即集合将是TB1TB2TB3TD1TD2 )并且没有语义或符号预见来定义某些父元素的本地绑定。 所以 UML 读者可能会误解设计意图。

选项 3 - 绑定和 inheritance

因此,最简洁的方法是分解绑定和 inheritance(我使用了绑定 class,它本身使用新参数名称模板化以对齐,但这可能有点矫枉过正):

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM