【问题标题】:UML:Inheritance between template classes with parameter dependenciesUML:继承泛型类,其中基类的模板类型使用派生类的类型
【发布时间】:2022-10-15 18:25:02
【问题描述】:

请原谅我糟糕的英语。让我向您展示我试图在 UML 类图中绘制的情况。

template<typename TB1, typename TB2, typename TB3>
class Base { ... };

template<typename TD1, typename TD2>
class Derived : public Base<typename TD1, typename TD2, int> { .... };

我知道当一个类继承泛型类时如何绘制UML类图,如下(similar question was asked before)。

但是如果基类的模板参数类型是由派生类的模板参数类型设置的,我该怎么办?只是添加另一个箭头指示绑定类型取决于派生类的模板参数?

【问题讨论】:

    标签: uml class-diagram


    【解决方案1】:

    我们尝试建模什么?

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

    • 它绑定Base模板类的参数,
    • 它创建了通过绑定参数获得的类之间的泛化。

    对于不熟悉 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>; 
      MyBase *p = new MyDerived();         // this assignment works because the bound 
                                           // MyBase generalization is a generalization 
                                           // from MyDerived
    }
    

    所以这段代码意味着BaseDerived 的通用特化是真的,无论参数绑定如何,特别是绑定MyBaseMyDerived

    如何在 UML 中显示它?

    第一次尝试可能是简单地使用绑定:

    UML 规范,第 9.3.3.1 节: (...) 内容如何合并到绑定元素中的细节保持开放。 (...) 绑定的分类器可能具有除其绑定产生的内容之外的内容。

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

    更好的方法是在模板之间使用继承,这对应于 C++ 语义:

    图片1

    这显示了继承。但是UML部分9.9.3.2 模板分类器特化说:

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

    我理解这意味着模板参数增加(即集合将是 TB1、TB2、TB3、TD1 和 TD2),并且没有预见到定义某些父元素的本地绑定的语义或符号。

    因此,最干净的方法是分解绑定和继承:

    图片2

    【讨论】:

      猜你喜欢
      • 2012-09-08
      • 2015-03-26
      • 2014-03-22
      • 1970-01-01
      • 2011-08-19
      • 1970-01-01
      • 1970-01-01
      • 2011-10-09
      • 1970-01-01
      相关资源
      最近更新 更多