【问题标题】:Generic type constraints (where clause) in UMLUML 中的泛型类型约束(where 子句)
【发布时间】:2017-05-29 14:27:12
【问题描述】:

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

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

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

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

谢谢。

【问题讨论】:

标签: c# generics uml class-diagram staruml


【解决方案1】:

简而言之:

UML 为此目的使用类模板:

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

更多关于模板参数的解释

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

ClassifierTemplateParameter 扩展了 TemplateParameter 的符号以包含可选的类型约束:

&lt;classifier-template-parameter&gt; ::=
&lt;parameter-name&gt; [ ‘:‘ &lt;parameter-kind&gt; ] [‘&gt;’ &lt;constraint&gt;]
[‘=’ &lt;default&gt;]
&lt;constraint&gt; ::= [‘{contract }’] &lt;classifier-name&gt;*

parameter-kind 表示parameteredElement 的元类。 如果是“类”,可能会被抑制。

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

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

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

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

T : class > {contract} IModel NewConstraint

但是由于class默认是参数种类,所以可以简化为:

T > {contract} IModel NewConstraint

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-21
    • 1970-01-01
    • 2022-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多