UML 中的类型化聚合

Typed aggregation in UML

在下面的 UML class 图中,我想表明 Course.chaptersChapter.sections 成员是由 AugmentedList<Chapter> 和 [=14= 实现的]分别。

我知道在SO上应该避免图片,所以这里是这个图对应的Kotlin代码。

interface AugmentedList<E>: List<E> {
  val introduction: String
  val conclusion: String
}

interface Section

interface Chapter {
  val sections: AugmentedList<Section>
}

interface Course {
  val chapters: AugmentedList<Chapter>
}

我知道将模板化 class 绑定到非模板化 class 的方法是通过 binding,但是我想避免向图表,因为接口 AugmentedList<Chapter>AugmentedList<Section> 不会在代码中显式实现。

也许对于未实现但仅在 UML 图中使用的接口存在刻板印象?

我也考虑过向 Course 接口添加限定符 chapters: AugmentedList<Chapter>,但我觉得这不是限定符的目的。

是否有正确的方法来准确说明组合的实现方式?

图表中的警告章节部分在错误的一侧,它们必须与多重性在同一侧0..*.


如果您不想显示命名绑定 类,例如 ChapterListSectionList,例如 :

你可以使用匿名绑定类(见图9.6 匿名绑定Class第106页formal/2017-12-05):

如果您甚至不想显示它们,您可以使用属性来显示属性:

无论如何,如果你想画你的作品,你可以这样做:

这清楚地(即使不是正式地)表明了 chapters/sections 是如何被记住的。当然理论上你必须定义构造型 AugmentedList,扩展元类 Association 通常用于模型到代码转换是扩展 UML 的原因之一(参见第 12.3.1.1 定位配置文件与元模型、MOF 和 UML formal/2017-12-05 第 252 和 253 页)

在图表中,我使用一些依赖项 <<use>> 来突出显示 类 之间的链接,它们不是强制性的,例如,您可以直接在 课程 [=53 之间使用它们=] 和 Chapter 以及在 ChapterSection 之间(如果情况并非如此)。