如何在UML中表示C++的嵌套类?

22

如何在UML中表示C++的嵌套类?

class A {
    class B {

    }
}

标记为重复的问题在其自身问题中回答了该问题,但使用了1.4符号。 - BobRodes
被标记为重复的问题仅涉及如何将嵌套类标记为私有,并不要求所有可能的嵌套类表示。 - www.admiraalit.nl
3个回答

21

在UML(任何语言)中,嵌套类可以表示为:

enter image description here

这里:

  1. Class Inner1 嵌套在外部类Outer1中
  2. Classes Inner2、Inner3和Inner4 类嵌套在Outer2中

参考文献取自 此处


14

我曾认为规范已经放弃了十字圆圈标记。因此,我在规范中四处搜索,并未在2.0版本中发现它的存在。我得出结论,2.0版本不再支持此功能。虽然它在1.4版本中有明确说明,但我已在整个2.4.1规范中进行了搜索,未能找到(实际上,在整个文档搜索中,“anchor”单词返回零结果)。我还做了一些其他方面的调查,以下是我找到的。

首先,我一直认为嵌套类是实现组合的一种方式。此外,UML试图在具体实现上保持独立性,而嵌套类并不是。 (您可以用其他方法创建组合,并非所有OO语言都支持嵌套类。)现在,1.4的解释包括以下内容:

如果将B类通过带有“A类锚点”线条连接到A类,则B类声明为A类命名空间中的一部分。也就是说,类A和类B之间的关系是命名空间-ownedElement关联。

好的。现在UML 2.0这样说:

核心包表示UML的核心建模概念,包括类、关联和包。

这是核心包的一个图示:

enter image description here

这很抽象,但看一下左上角的NamedElement抽象类(“NamedElement”类是具有名称的元素),请注意Namespace从它那里派生而来。现在,请注意右侧,直接位于Namespace类的顶部右侧,有另一个NamedElement类。其中一个关联具有{subsets ownedElement}属性,并且命名空间端有一个组合钻石。在命名空间端,有{subsets owner}属性。

这意味着,当NamedElement与Namespace以组成关联方式一起使用时,它是Namespace的子集。换句话说,Namespace和NamedElement之间的关系是1.4规范中描述的namespace-ownedElement关联。因此,当用命名空间和ownedElement属性修饰组合关系时,表示嵌套(或内部,或内置,或您最喜欢的编程语言如何调用它)类。
因此,我要说,如果您正在使用组成符号,则这是接受的2.0显示嵌套类的方法。就像这样:
现在,另一种方法是将嵌套类放入包含类中。规范中的符号示例似乎没有显示这种方法,但它们显示了其他NamedElements(packages、components等)的方法,所以我不明白为什么不能。
但是,我认为锚点符号已经过时了。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端点的关联名称。但是这些类没有任何超类。 - www.admiraalit.nl
“圆圈加号”符号在 UML 2.* 中仍然有效。UML 2.5.1 规范的第7.4.4.1节指出:符合要求的工具可以选择性地允许在包含其他类型的命名空间成员(例如嵌套分类器)时使用子句12.2.4定义的“圆圈加号”符号来显示包成员关系。 - www.admiraalit.nl
另外,嵌套类可以显示在外部类的隔间内。UML规范的第9.2.4.1节说:如果一个分类器拥有作为分类器的ownedMembers,则符合规范的工具可以提供选项,在拥有分类器矩形的单独隔间中以图表方式嵌套显示所拥有的分类器及其之间的关系。例如,显示Class的属性nestedClassifier的内容的隔间(参见11.4.2)应称为“嵌套分类器”。 - www.admiraalit.nl
我无法添加答案。该问题已关闭。 - www.admiraalit.nl
问题已经重新开放,我在这里添加了我的答案。 - www.admiraalit.nl
显示剩余2条评论

8
嵌套类可以显示在外部类的一个隔室内。

nested-classes

UML 2.5.1 规范的第9.2.4.1节规定:

如果一个分类器拥有的成员是分类器,符合规范的工具可以提供选项以图形化方式在拥有分类器矩形的单独区域中嵌套显示所拥有的分类器及其之间的关系。(...)例如,对于类(参见11.4.2),显示属性nestedClassifier的内容的区域应称为“嵌套分类器”。

或者,可以使用“圆圈加号”符号来显示嵌套类:

cpn

UML 2.5.1规范的第7.4.4.1节说:

符合规范的工具可以选择性地允许使用子条款12.2.4中定义的“圆加号”符号来显示包成员关系,也可以用于其他类型的命名空间(例如,用于显示嵌套分类器)。

(我从@stamhaney发布的答案中复制了图像)


你的“Section 9.2.4.1”也来自于2.5.1 UML规范吗? - BobRodes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接