UML 中的通用类型约束(where 子句)

Gen*_*ood 6 c# generics uml class-diagram staruml

我有一个通用的 C# 类,如下所示:

public class Database<T>
    where T : class, IModel, new()
{
    //Some code ...
}
Run Code Online (Sandbox Code Playgroud)

T 应该实现接口 IModel 并且 T 必须是具有空构造函数的类。

问题是,这在 UML 类图中看起来如何。

谢谢。

Chr*_*phe 3

简而言之:

\n

UML 使用类模板来实现此目的:

\n

UML 类模板带有一个普通的类框,以及一个重叠在右上角的小虚线框,其中显示了模板参数

\n

为此,您必须在某个地方(在 C# 配置文件中?)定义NewConstraint一个特殊的接口,该接口要求实现类具有无参数构造函数。或者,您可以跳过此步骤NewConstraint并添加一个简单的 UML 约束(例如,带有明文约束的注释{ T shall have a parameterless constructor }

\n

关于模板参数的更多解释

\n

有关 UML 分类器模板语法的更多信息,请参阅 UML 规范(第 103 页):

\n
\n

ClassifierTemplateParameter扩展了TemplateParameter的表示法以包含可选类型约束: \n \n

<classifier-template-parameter> ::=
<parameter-name> [ \xe2\x80\x98:\xe2\x80\x98 <parameter-kind> ] [\xe2\x80\x98>\xe2\x80\x99 <constraint>]
[\xe2\x80\x98=\xe2\x80\x99 <default>]
<constraint> ::= [\xe2\x80\x98{contract }\xe2\x80\x99] <classifier-name>*

\n

parameter -kind指示parameteredElement的元类。如果是 \xe2\x80\x98Class.\xe2\x80\x99 则可能会被抑制

\n

约束的分类器名称指定a constrainingClassifier,其可以有零个或多个,其含义在上面的语义中指定。\xe2\x80\x98contract\xe2\x80\x99 选项表示allowedSubstitutable为 true。

\n
\n

由于我误解了我{contract}自己,并且首先将其与普通约束混淆了,所以让我们澄清这个重要提示:

\n
    \n
  • {contract} xxx意味着该参数允许用与 具有相同约定的分类器替换该参数xxx。当参数是受特定接口约束的类时,需要这样做。
  • \n
  • xxx(without {contract}) 表示该参数必须是该参数xxx或其特化。因此,这不能用于必须实现接口的类,因为该类是接口的实现而不是专门化。
  • \n
\n

在您的情况下,参数将是:

\n
T : class > {contract} IModel NewConstraint\n
Run Code Online (Sandbox Code Playgroud)\n

但由于 class 默认是参数类型,因此可以简化为:

\n
T > {contract} IModel NewConstraint\n
Run Code Online (Sandbox Code Playgroud)\n