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 类图中看起来如何。
谢谢。
UML 使用类模板来实现此目的:
\n\n为此,您必须在某个地方(在 C# 配置文件中?)定义NewConstraint一个特殊的接口,该接口要求实现类具有无参数构造函数。或者,您可以跳过此步骤NewConstraint并添加一个简单的 UML 约束(例如,带有明文约束的注释{ T shall have a parameterless constructor })
有关 UML 分类器模板语法的更多信息,请参阅 UML 规范(第 103 页):
\n\n\nClassifierTemplateParameter扩展了TemplateParameter的表示法以包含可选类型约束: \n \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>*parameter -kind指示parameteredElement的元类。如果是 \xe2\x80\x98Class.\xe2\x80\x99 则可能会被抑制
\n约束的分类器名称指定a
\nconstrainingClassifier,其可以有零个或多个,其含义在上面的语义中指定。\xe2\x80\x98contract\xe2\x80\x99 选项表示allowedSubstitutable为 true。
由于我误解了我{contract}自己,并且首先将其与普通约束混淆了,所以让我们澄清这个重要提示:
{contract} xxx意味着该参数允许用与 具有相同约定的分类器替换该参数xxx。当参数是受特定接口约束的类时,需要这样做。xxx(without {contract}) 表示该参数必须是该参数xxx或其特化。因此,这不能用于必须实现接口的类,因为该类是接口的实现而不是专门化。在您的情况下,参数将是:
\nT : class > {contract} IModel NewConstraint\nRun Code Online (Sandbox Code Playgroud)\n但由于 class 默认是参数类型,因此可以简化为:
\nT > {contract} IModel NewConstraint\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
831 次 |
| 最近记录: |