[英]How to represent the nested class of C++ in UML?
如何用UML表示嵌套的C ++类? A级{B级{}}
我原本以为规格偏离了交叉圆圈符号。 所以,我做了一些在规格中徘徊,并在2.0中找不到它。 我必须得出结论,2.0规范不再支持它。 虽然它实际上是在v1.4中指定的,但我查看了2.4.1规范,并且它无处可见(实际上,“anchor”一词在文档范围内搜索时返回0结果)。 我做了一些其他的环顾四周,这就是我可以拼凑的东西。
首先,我一直都知道嵌套类是实现组合的一种方法。 此外,UML尝试与实现无关,而嵌套类则不然。 (您可以通过其他方式创建组合,并非所有OO语言都支持嵌套类。)现在,1.4的解释包括:
如果类B通过“锚”行与类A的“锚”符号连接到类A,则类B在类A的命名空间内声明。也就是说,类A和类B之间的关系是名称空间-owned元素关联。
好。 现在UML 2.0说:
内核包表示UML的核心建模概念,包括类,关联和包。
这是内核包的图表:
这是非常深奥的,但请看左上角的NamedElement抽象类。 (“NamedElement”类是具有名称的元素。)请注意,Namespace派生自它。 现在,请注意右侧,直接在Namespace类顶部的右侧,还有另一个NamedElement类。 其中一个关联上有{subsets ownedElement}属性,Namespace端有一个组合菱形。 在Namespace端,有{subsets owner}属性。
这意味着NamedElement在与Namespace的组合关联时,是Namespace的子集。 换句话说,Namespace和NamedElement之间的关系是1.4规范中描述的namespace-ownedElement关联。 因此,当使用namespace和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>>
构造型,要么将嵌套类放在所有者类中。
嵌套类可以显示在外部类的隔离专区内。
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”表示法显示包成员资格也可用于显示其他种类命名空间的成员资格(例如,显示nestedClassifiers)。
(我复制了@stamhaney发布的答案中的图片)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.