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

How to represent the nested class of C++ in UML?

如何在UML中表示C++的嵌套class? class一个{ class乙{ } }

UML 中的嵌套 class(对于任何语言)可以表示为:

这里

  1. Class 内层 1 嵌套在外层 class 外层 1
  2. Classes Inner2, Inner3, Inner4 classes嵌套在Outer2

引用自here

我原以为规范脱离了 cross-and-circle 符号。所以,我在规范中四处游荡,但在 2.0 中找不到它。我不得不得出结论,2.0 规范不再支持它。虽然它实际上是在 v1.4 中指定的,但我查看了整个 2.4.1 规范,但在任何地方都看不到它(事实上,单词 "anchor" returns 0 导致 document-wide 搜索)。我做了一些其他的环顾四周,这就是我可以拼凑的东西。

首先,我一直认为嵌套 classes 是一种实现组合的方式。此外,UML 试图成为 implementation-agnostic,而嵌套的 class 则不是。 (您可以通过其他方式创建组合,并非所有 OO 语言都支持嵌套 classes。)现在,1.4 的解释包括:

If Class B is attached to Class A by an “anchor” line with the “anchor” symbol on Class A, then Class B is declared within the Namespace of Class A. That is, the relationship between Class A and Class B is the namespace-ownedElement association.

好的。现在 UML 2.0 是这样说的:

Kernel package represents the core modeling concepts of the UML, including classes, associations, and packages.

这是内核包的示意图:

这很深奥,但请看一下左上角的 NamedElement 摘要 class。 ("NamedElement" class 是一个有名称的元素。)请注意,Namespace 派生自它。现在,请注意右侧,在命名空间 class 顶部的右侧,还有另一个 NamedElement class。其中一个关联有 {subsets ownedElement} 属性,在命名空间端有一个合成菱形。在命名空间端,有{subsets owner} 属性。

这意味着 NamedElement 在与命名空间组合关联时是命名空间的子集。也就是说,Namespace和NamedElement的关系就是1.4规范中描述的namespace-ownedElement关联。因此,组合关系,当装饰有命名空间和 ownedElement 属性时,表示嵌套(或内部,或内部,或任何您喜欢的编码语言称之为)class.

所以,我要说的是,如果您使用组合符号,这是显示嵌套 classes 的公认 2.0 方式。像这样:

现在,另一种方法是将嵌套的 class 粘贴到包含 class 的内部。规范中的符号示例没有显示此 AFAICS,但它们与其他命名元素(包、组件等)一起显示,所以我不明白为什么你不能。

但是,我没有看到锚符号是最新的。 xmojmr 最喜欢的网站(也是一个不错的网站)www.uml-diagrams.org,有这样的说法:

Now obsolete UML 1.4.2 Specification defined nested class as a class declared within another class and belonging to the namespace of the declaring class. Relationship between those classes was called "namespace owned element association

Nested classifier, e.g. nested class, nested interface, or nested use case could be used like any other classifier but only inside the containing class or interface.

Per UML 1.4.2 a declaring (nesting) class and a nested class could be shown connected by a line, with an "anchor" icon on the end connected to the declaring class. An anchor icon is a cross inside a circle.

UML 2.x specifications - including the recent UML 2.4.1 - describe nesting of classifiers within structured classes without providing explicit notation for the nesting. Note, that UML's 1.4 "anchor" notation is still used in one example in UML 2.4.x for packages as an "alternative membership notation" and without providing any other details or explanations.

我找不到那个 "one example" 图表,所以它可能还在附近。但至少,该表示法似乎已被弃用。我要么使用这些属性,创建一个 <<nested>> 构造型,要么将嵌套的 class 放入所有者 class.

嵌套的 class 可能会显示在外部 class 的隔间内。

UML 版本 2.5.1 规范的第 9.2.4.1 节说:

If a Classifier has ownedMembers that are Classifiers, a conforming tool may provide the option to show the owned Classifiers, and relationships between them, diagrammatically nested within a separate compartment of the owning Classifier’s rectangle. (...) For example, a compartment showing the contents of the property nestedClassifier for a Class (see 11.4.2) shall be called “nested classifiers”.

或者,嵌套的 classes 可以使用 "circle-plus" 表示法显示:

UML 2.5.1 规范的第 7.4.4.1 节说:

Conforming tools may optionally allow the “circle-plus” notation defined in sub clause 12.2.4 to show Package membership to also be used to show membership in other kinds of Namespaces (for example, to show nestedClassifiers).

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