【发布时间】:2015-01-06 11:19:33
【问题描述】:
如何在 UML 中表示 C++ 的嵌套类? A类{ B类{ } }
【问题讨论】:
-
标记为重复的问题在其自己的问题中回答问题,但使用 1.4 表示法。
-
标记为重复的问题只是关于如何将嵌套类标记为私有,并不要求嵌套类的所有可能表示形式。
如何在 UML 中表示 C++ 的嵌套类? A类{ B类{ } }
【问题讨论】:
【讨论】:
我曾认为规范脱离了十字和圆形符号。所以,我在规范中四处游荡,在 2.0 中找不到它。我不得不得出结论,2.0 规范不再支持它。虽然它实际上是在 v1.4 中指定的,但我查看了 2.4.1 规范的所有内容,但它在任何地方都看不到(事实上,“锚”这个词在文档范围的搜索中返回 0 结果)。我做了一些其他的环顾四周,这就是我可以拼凑的。
首先,我一直明白嵌套类是实现组合的一种方式。此外,UML 尝试与实现无关,而嵌套类则不是。 (您可以通过其他方式创建组合,并非所有 OO 语言都支持嵌套类。)现在,1.4 的解释包括:
如果 Class B 通过 Class A 上带有“anchor”符号的“anchor”线连接到 Class A,则 Class B 是在 Class A 的 Namespace 中声明的。即 Class A 和 Class B 之间的关系是 namespace-ownedElement 关联。
好的。现在 UML 2.0 是这样说的:
内核包代表了 UML 的核心建模概念,包括类、关联和包。
这是内核包的示意图:
这很深奥,但请看一下左上角的 NamedElement 抽象类。 (“NamedElement”类是具有名称的元素。)请注意,命名空间派生自它。现在,请注意在右侧,直接在 Namespace 类顶部的右侧,还有另一个 NamedElement 类。其中一个关联具有 {subsetsownedElement} 属性,并且在 Namespace 端有一个组合菱形。在命名空间端,有 {subsets owner} 属性。
这意味着当与命名空间组合关联时,NamedElement 是命名空间的一个子集。也就是说,Namespace 和 NamedElement 之间的关系是 1.4 规范中描述的 namespace-ownedElement 关联。因此,组合关系在使用命名空间和ownedElement 属性进行修饰时,表示一个嵌套的(或内部的,或内部的,或任何您喜欢的编码语言所称的)类。
所以,如果您使用组合表示法,我会说这是显示嵌套类的公认 2.0 方式。像这样:
现在,另一种方法是将嵌套类粘贴到包含类中。规范中的符号示例没有显示此 AFAICS,但它们与其他 NamedElements(包、组件等)一起显示,所以我不明白为什么不能。
但是,我看不到锚符号是最新的。 xmojmr 最喜欢的网站(也是一个不错的网站)www.uml-diagrams.org,对此有这样的说法:
现在已过时的 UML 1.4.2 规范将嵌套类定义为在另一个类中声明并属于声明类的名称空间的类。这些类之间的关系称为“命名空间拥有的元素关联”
嵌套分类器,例如嵌套类、嵌套接口或嵌套用例可以像任何其他分类器一样使用,但只能在包含的类或接口内使用。
根据 UML 1.4.2,一个声明(嵌套)类和一个嵌套类可以显示为由一条线连接,末端有一个“锚”图标连接到声明类。锚图标是圆圈内的十字。
UML 2.x 规范——包括最近的 UML 2.4.1——描述了分类器在结构化类中的嵌套,而没有为嵌套提供明确的符号。请注意,UML 1.4 的“锚”符号在 UML 2.4.x 的一个示例中仍用于包的“替代成员符号”,并且没有提供任何其他细节或解释。
我找不到那个“一个示例”图表,所以它可能还在。但至少,该符号似乎已被弃用。我会使用这些属性,创建一个<<nested>> 原型,或者将嵌套类放在所有者类中。
【讨论】:
{subsets namespace} 暗示在 ParentClass 的超类和 NestedClass 的超类之间也存在类似的关联,namespace 是关联在 NestedClass 端结束。但是这些类没有任何超类。
嵌套类可以显示在外部类的隔间内。
UML 2.5.1 版规范的第 9.2.4.1 节说:
如果分类器拥有属于分类器的成员,则符合工具可以提供选项来显示拥有的分类器以及它们之间的关系,以图解方式嵌套在拥有分类器的矩形的单独隔间内。 (...) 例如,显示类的属性 nestedClassifier 内容的隔间(参见 11.4.2)应称为“嵌套分类器”。
或者,可以使用“circle-plus”表示法显示嵌套类:
UML 2.5.1 规范的第 7.4.4.1 节说:
符合条件的工具可以选择允许在子条款 12.2.4 中定义的“circle-plus”表示法来显示包成员资格,也可以用于显示其他类型命名空间中的成员资格(例如,显示嵌套分类器)。
(我从@stamhaney 发布的答案中复制了图片)
【讨论】: