2

假设有两个类,ClassB是子类 ClassA并且B具有akind of的属性A,如下面的伪代码所示:

class A {}

class B extends A { 
     A a; 
}

在 UML 中,classB和 class之间有两种关系AB'is-a' 是一种Aon 而B'has-a' 的属性A。我可以在一个类图中同时表示这些关系吗?

在此处输入图像描述

当我在谷歌上搜索时,所有结果中两个类之间只存在一种关系是很常见的。所以我不确定是否允许这样绘制图表。如果不是,UML 如何表达这种类之间的关系。

4

5 回答 5

3

当然有可能。示例:人类是一种动物,可以将动物作为宠物。(尽管人们可能想要禁止人类作为宠物的规则。:-))

然而,绝对行不通的一件事是使最小基数为 1。这意味着每只宠物也必须有一只宠物!

请注意您的文本、伪代码和 UML 不匹配。您的 UML 图使用组合,这意味着当我的示例中的宠物死时,主人也必须死!要解决此问题,您可以使用白色钻石。

于 2013-08-10T05:52:10.647 回答
1

这方面的经典例子是:

A=Piece B=CompositePiece(由其他部分组成,无论是否复合)

于 2013-08-10T05:53:28.217 回答
1

是的,这是可能的,尽管不常见。请记住,一个类是一个抽象实体,它可以有几个不同的实例,允许我们有这样的结构。

例如,一个包含圆圈的红色圆圈:

红色圆圈包含一个圆圈

class Circle {}

class RedCircle extends Circle { 
     Circle a; 
     //...
     //more stuff for the red property
}
于 2013-08-10T06:37:44.693 回答
1

这种方法最常见的应用之一被称为复合设计模式,通常用于表示树状数据结构。

这种模式不仅使您可以表示一棵树(层次结构),而且还可以有效且统一地处理它(通过适当的operation()实现)。

复合图案

编辑

在写这个答案时,我完全忘记了另一个广泛使用的装饰器设计模式,它用于通过继承和包含来增强组件的功能,而不是在无法或不适合直接覆盖方法的情况下简单地扩展它。

装饰图案

于 2013-08-10T13:37:53.013 回答
-1

你绝对可以。

您可以使用它的一个示例是某种自定义 LinkedList,您希望每个节点由于某种原因成为不同的子类。在这种情况下,节点将属于类型节点,但也包含对下一个/上一个节点的引用。

至于如何在 UML 中表达这一点,我看不出为什么不能用两条线连接相同的两个框——毕竟,它确实有两个独立的关系。

于 2013-08-10T04:25:12.960 回答