如何在UML中表示C++的嵌套类?
class A {
class B {
}
}
在UML(任何语言)中,嵌套类可以表示为:
这里:
参考文献取自 此处
我曾认为规范已经放弃了十字圆圈标记。因此,我在规范中四处搜索,并未在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的核心建模概念,包括类、关联和包。
这是核心包的一个图示:
这很抽象,但看一下左上角的NamedElement抽象类(“NamedElement”类是具有名称的元素),请注意Namespace从它那里派生而来。现在,请注意右侧,直接位于Namespace类的顶部右侧,有另一个NamedElement类。其中一个关联具有{subsets ownedElement}属性,并且命名空间端有一个组合钻石。在命名空间端,有{subsets owner}属性。
这意味着,当NamedElement与Namespace以组成关联方式一起使用时,它是Namespace的子集。换句话说,Namespace和NamedElement之间的关系是1.4规范中描述的namespace-ownedElement关联。因此,当用命名空间和ownedElement属性修饰组合关系时,表示嵌套(或内部,或内置,或您最喜欢的编程语言如何调用它)类。我找不到那个“一个例子”的图表了,所以可能它仍然存在。但至少,这种符号表示法似乎已经过时了。我会使用属性、创建一个<<nested>>的原型,或者将嵌套类放在所有者类内部。
{subsets namespace}
意味着在ParentClass的一个超类和NestedClass的一个超类之间也存在类似的关联,其中namespace
是NestedClass端点的关联名称。但是这些类没有任何超类。 - www.admiraalit.nlUML 2.5.1 规范的第9.2.4.1节规定:
如果一个分类器拥有的成员是分类器,符合规范的工具可以提供选项以图形化方式在拥有分类器矩形的单独区域中嵌套显示所拥有的分类器及其之间的关系。(...)例如,对于类(参见11.4.2),显示属性nestedClassifier的内容的区域应称为“嵌套分类器”。
或者,可以使用“圆圈加号”符号来显示嵌套类:
UML 2.5.1规范的第7.4.4.1节说:
符合规范的工具可以选择性地允许使用子条款12.2.4中定义的“圆加号”符号来显示包成员关系,也可以用于其他类型的命名空间(例如,用于显示嵌套分类器)。
(我从@stamhaney发布的答案中复制了图像)