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

时间:2017-05-29 14:27:12

标签: c# generics uml class-diagram staruml

我有一个通用的C#类,看起来像这样:

public class Database<T>
    where T : class, IModel, new()
{
    //Some code ...
}

T应该实现接口IModel,T必须是一个带有空构造函数的类。

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

谢谢。

1 个答案:

答案 0 :(得分:1)

简而言之:

UML 为此使用类模板:

UML class template with an ordinary class box, and a small doted box overlapping top right corner in which template paramters are shown

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

关于模板参数的更多解释

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

<块引用>

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

<classifier-template-parameter> ::=
<parameter-name> [ ‘:‘ <parameter-kind> ] [‘>’ <constraint>]
[‘=’ <default>]
<constraint> ::= [‘{contract }’] <classifier-name>*

parameter-kind 表示parameteredElement 的元类。 如果是‘Class’可能会被抑制。

约束的 classifier-name 指定一个 constrainingClassifier,其中可能有零个或多个,其含义在上述语义中指定。 ‘contract’ 选项表示 allowSubstitutable 为真。

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

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

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

T : class > {contract} IModel NewConstraint

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

T > {contract} IModel NewConstraint