假设我有这样一个函数:
public AddComponent<T extends Component>(type: T) {
//do stuff
}
我如何在 UML 图中表示它?对于普通功能,我会这样写:
+AddComponent(object: Component): void
编辑:为了让我的问题更清楚一点,这里是我的 UML 表中的一个类示例。
(抱歉,我现在才刚学)
最佳答案
首先,与您的问题无关:您不应该在不同的操作组之间使用行分隔符:保留它以区分属性和操作。
不幸的是,UML 规范并未完全明确模板及其语义。
语义在 7.3.2 节中定义。将模板及其绑定(bind)定义为某种替代。
它在9.6.4 节中定义了模板操作的表示法。这就是您要找的:
MyQuestionFunction < T: Class > (arg:T)
如果您必须使用它们,它还定义了具体的绑定(bind):
MyQuestionFunction << T->Component >> (arg: Component)
但它没有预见到对模板参数指定约束,说 T
必须是 Component
。所以恕我直言,它似乎更符合 C++ 类型的模板,其中类型参数没有明确约束。您最终可以在函数旁边用自然语言记录一般的 UML 约束:{T extends Component}
该部分提供的 BNF 规范进一步记录了如何将操作指定为模板参数,但在基础知识方面似乎不完整。
回到您的图表,还要注意 UML 标准配置文件:
- 不使用
void
返回类型。在严格的 UML 中,只显示一个 void 函数,根本没有任何返回类型。 - 不知道
int
基本类型,但知道Integer
。
但是,建模者经常使用实现语言的类型,假设一个特定于语言的配置文件将扩展具有缺失类型的核心 UML。如果您选择了这种方法,您可以很好地保留您定义的模板化函数。
关于generics - 如何在 UML 中表示模板函数的类型约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59663208/