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

8aqjt8rx  于 2022-12-30  发布在  其他
关注(0)|答案(3)|浏览(303)

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

class A {
    class B {

    }
}
myzjeezk

myzjeezk1#

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

给你
1.类Inner1嵌套在外部类Outer 1内
1.类Inner2、Inner3、Inner4类嵌套在Outer2内部
参考取自here

qq24tv8q

qq24tv8q2#

我曾认为规范摆脱了交叉和圆圈的符号。所以,我在规范中做了一些漫游,在2.0中没有找到它。我不得不得出结论,2.0规范不再支持它。虽然它实际上在v1.4中指定,但我查看了整个2.4.1规范,没有任何地方可以看到它(事实上,单词“锚”在文档范围内搜索时返回0个结果)我做了一些其他的查找,下面是我能拼凑出来的。
首先,我一直认为嵌套类是实现组合的一种方式。此外,UML试图成为实现不可知论者,而嵌套类不是。(您可以用其他方式创建组合,并且不是所有的OO语言都支持嵌套类。)现在,1.4的解释包括以下内容:
如果类B通过类A上带有“anchor”符号的“锚”行附加到类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关联。因此,组合关系在用namespace和ownedElement属性装饰时表示一个嵌套的(或内部的,或任何您喜欢的编码语言所称的)类。
所以,我想说,如果你使用复合表示法,这是Python 2.0中公认的显示嵌套类的方法,就像这样:

现在,另一种方法是将嵌套类粘贴到包含类中。规范中的符号示例没有显示这个AFAICS,但它们显示了它与其他NamedElements(包、组件等),所以我不明白为什么你不能。
但是,我看不出锚记法是当前流行的。xmojmr最喜欢的站点(也是一个好站点)www.uml-diagrams.org对此有如下描述:
现在废弃的UML1.4.2规范将嵌套类定义为在另一个类中声明的类,并且属于声明类的名称空间。这些类之间的关系被称为“名称空间拥有的元素关联
嵌套分类器,例如嵌套类、嵌套接口或嵌套用例,可以像任何其他分类器一样使用,但只能在包含类或接口的内部使用。
根据UML 1.4.2,声明(嵌套)类和嵌套类可以用一条线连接起来,在连接到声明类的一端有一个“锚”图标。锚图标是一个圆圈里的十字。
UML 2.x规范--包括最近的UML 2.4.1 --描述了结构化类中分类器的嵌套,但没有为嵌套提供显式的符号。注意,UML 1.4的“锚”符号仍然在UML 2.4.x的一个例子中作为“替代成员符号”用于包,并且没有提供任何其他细节或解释。
我找不到那个“一个例子”的图表,所以它可能还在,但是至少,这个符号看起来已经过时了,我要么使用属性,创建一个<<nested>>原型,要么把嵌套类放在所有者类里面。

drkbr07n

drkbr07n3#

嵌套类可以显示在外部类的隔离舱内。

UML9.2.4.1版本2.5.1规范的www.example.com部分指出:
如果一个分类器拥有作为分类器的ownedMember,一个相容的工具可以提供选项来显示所拥有的分类器,以及它们之间的关系,以图形方式嵌套在拥有分类器矩形的一个单独的区间内.(...)例如,一个显示类的属性nestedClassifier的内容的区间(参见11.4.2)应该被称为“嵌套分类器.”
或者,可以使用“圆圈+”符号显示嵌套类:

UML 7.4.4.1 2.5.1规范的www.example.com部分指出:
一致性工具可以选择性地允许子条款12.2.4中定义的“圆圈+”符号显示包成员资格,也可用于显示其他类型的命名空间中的成员资格(例如,显示nestedClassifier)。
(我从@stamhaney发布的答案中复制了图片)

相关问题