据我所知,为开放泛型类型提供类型参数可以通过使用 bind 构造型在 UML 类图中表示。
例如,参加以下课程:
public class A<T> {
}
public class B {
public A<string> Value { get; set; }
}
这可以建模为 UML 类图,如下所示:
但是如果我们传递泛型类型参数,从而基于
A<T>
构造一个开放的泛型类型呢?
public class A<T> {
}
public class B<X> {
public A<X> Value { get; set; }
}
基于上面的表示法,我认为UML类图应该是这样的:
但这看起来有点令人困惑,因为
X
来自哪里并不明显——毕竟,它只是在B
的范围内声明,但似乎像A<X>
中的全局有效声明一样使用。
一旦多个类型引用 A
并提供一些名为 X
的通用参数,问题就变得明显 - 例如让我们添加以下类:
public class C<X> {
public A<X> Data { get; set; }
}
这会导致我们最终得到多个看起来完全相同的节点的情况:
...或使用标识符
X
一次表示多个不同(单独声明!)的事物。
有关于如何处理这个问题的通用约定吗?
请注意,如果我编写例如,构造类型的类标签可能看起来更好
A<string>
,但如果没有软件渲染 string
作为实际的开放通用参数,我无法找到如何在 PlantUML中执行此操作。 因此,本文中使用了方括号,从而产生了诸如
A[string]
.之类的标签
您在这里解决了 UML 中模板的一个关键弱点,这使得许多现代通用编程结构变得模糊不清。
问题在于,模板外部使用的
X
与模板参数 X
没有任何关系。模板参数仅在模板内明确定义,并且当您使用绑定表达式时(顺便说一句,您应该编写 «bind» T->string
或 «bind» T->X
来明确要绑定哪个模板参数)。一旦你在模板之外使用它并且没有绑定,它实际上与模板参数无关,你只能在视觉上将它们关联起来(另见这个其他答案)并希望你的读者有同样的理解。
问题已经从这里开始了:
public class B<X> {
public X Value { get; set; }
}
如果您在类中使用属性
Value:X
对此进行建模,很明显它是模板类型。但是,如果将其建模为属性,即与 X 关联的拥有端,则它是不明确的。这使得对多个模板类的组合使用进行建模特别困难。
你的例子只是下一个难度级别。