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

时间:2015-01-06 11:19:34

标签: c++ uml

如何用UML表示嵌套的C ++类? A级{ B级{ } }

3 个答案:

答案 0 :(得分:12)

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

enter image description here

这里

  1. Class Inner1嵌套在外部类Outer 1
  2. 类Inner2,Inner3,Inner4类嵌套在Outer2
  3. 摘自here

答案 1 :(得分:12)

我曾经认为规范远离了交叉圆圈符号。所以,我做了一些在规格中徘徊,并在2.0中找不到它。我必须得出结论,2.0规范不再支持它。虽然它实际上是在v1.4中指定的,但我查看了2.4.1规范,并且它无处可见(实际上,“anchor”一词在文档范围内搜索时返回0结果)。我做了一些其他的环顾四周,这就是我可以拼凑的东西。

首先,我一直都知道嵌套类是实现组合的一种方法。此外,UML尝试与实现无关,而嵌套类则不然。 (您可以通过其他方式创建合成,并非所有OO语言都支持嵌套类。)现在,1.4的解释包括:

  

如果B类通过A类上带有“锚”符号的“锚”线附加到A类,则B类在A类的命名空间内声明。即,A类和B类之间的关系是namespace-ownedElement关联。

确定。现在UML 2.0说:

  

内核包代表了UML的核心建模概念,包括类,关联和包。

以下是内核包的图表:

enter image description here

这是非常深奥的,但请看左上角的NamedElement抽象类。 (“NamedElement”类是具有名称的元素。)请注意,Namespace派生自它。现在,请注意右侧,直接在Namespace类顶部的右侧,还有另一个NamedElement类。其中一个关联上有{subsets ownedElement}属性,Namespace端有一个组合菱形。在Namespace端,有{subsets owner}属性。

这意味着NamedElement在与Namespace的组合关联时,是Namespace的子集。换句话说,Namespace和NamedElement之间的关系是1.4规范中描述的namespace-ownedElement关联。因此,当使用namespace和ownedElement属性装饰时,组合关系表示嵌套(或内部或内部,或您喜欢的任何编码语言调用它)类。

所以,我要说的是,如果你使用的是组合符号,这是显示嵌套类的2.0方法。像这样:

enter image description here

现在,另一种方法是将嵌套类粘贴到包含的类中。规范中的符号示例没有显示此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>>构造型,要么将嵌套类放在所有者类中。

答案 2 :(得分:1)

嵌套类可能会显示在外部类的隔离专区中。

nested-classes

UML 2.5.1版规范的9.2.4.1节说:

  

如果分类器具有属于分类器的ownerMembers,则一致性工具可以提供选项以显示所拥有的分类器以及它们之间的关系,它们以图形方式嵌套在拥有的分类器矩形的单独隔间中。 (...)例如,将显示类的nestedClassifier属性的内容(请参见11.4.2)的隔离专区称为“嵌套分类器”。

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

cpn

UML 2.5.1规范的7.4.4.1节说:

  

符合性工具可以有选择地允许第12.2.4节中定义的“加号”符号显示包成员身份,还可以用于显示其他类型的命名空间中的成员身份(例如,显示nestedClassifiers)。

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