UML 模板的限制
您遇到的问题与 UML 处理用绑定元素替换模板参数的方式有关。这主要是由符号引起的,而不是由继承引起的。
事实上,如果你有一个myClass
只有组成:
template<typename T>
class myClass {
T a;
vector<T> v;
...
};
using myClassDataA = myClass<dataA>;
您可以在 UML 中以独立的方式表示它,模板参数仅在模板类中使用:
但据我所知,如果您想将 T 属性显示为关联结束,则无法模板化同一类的等效表达式:
对于继承来说,也是同样的问题:继承的类在模板类之外。但在这里,没有符号快捷方式可以神奇地将其包含在模板框中。
视觉解决方法?
如果它主要用于 C++ 设计的图形通信,您可以直观地建议一组类都依赖于相同的模板参数。在我上面的构图示例中,它看起来像:
对于您的继承情况,它将是:
但请记住,有UML 中没有定义语义为了那个原因。例如,没有任何东西可以让 UML 工具识别myClass<dataA>
这将继承自dataA
。换句话说,任何 UML 代码生成器或工具都无法通过模型生成有意义的内容,但其他 C++ 程序员将完全理解您的意思。
更好的设计?
虽然您的模板构造非常强大,但它也很容易出错,因为您可以在同一模板的实例化上执行的操作取决于绑定。这意味着模板的每个实例都需要不同的测试用例。
因此值得提醒一下一般原则:
优先选择组合而不是继承 https://en.wikipedia.org/wiki/Composition_over_inheritance
所以只需创建一个dataHandler
模板类中的成员,并将一组明确的操作转发给该成员,这些操作对于所有处理程序来说都是通用的。然后,您可以毫无困难地使用现有的 UML 语义在 UML 中对其进行建模。
我知道,它不太灵活;但我想转发操作上的一点额外麻烦,会为你以后省去很多麻烦。如果你确实需要更多的灵活性,你也可以考虑反转继承使用CRTP https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern但这一次有很多更清晰、明确的 UML 建模 https://stackoverflow.com/q/60145328/3723423.