“is-a”和“has-a”可以同时存在吗?

时间:2013-08-10 03:43:59

标签: uml

假设有两个类,类B是子类AB有一个属性a,它是A的一种,作为伪代码下面显示:

class A {}

class B extends A { 
     A a; 
}

在UML词中,类B和类A之间存在两种关系。 B'是A,而B'具有A的属性。我可以在一个类图中同时表示这些关系吗?

enter image description here

当我谷歌这个时,通常在所有结果中两个类之间只存在一个关系。所以我不确定是否允许这样画图。如果没有,UML如何在类之间表达这种关系。

5 个答案:

答案 0 :(得分:3)

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

然而, 工作的一件事是制作最小基数1.这意味着每个宠物也必须有宠物!

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

答案 1 :(得分:1)

这方面的经典例子是:

A =件 B = CompositePiece(由其他部分组成,无论是复合材料还是非复合材料)

答案 2 :(得分:1)

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

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

Red circle contains a circle

class Circle {}

class RedCircle extends Circle { 
     Circle a; 
     //...
     //more stuff for the red property
}

答案 3 :(得分:1)

此方法最常见的应用之一称为Composite design pattern,通常用于表示树状数据结构。

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

Composite pattern

修改

在写这个答案时,我完全忘记了另一个广泛使用的Decorator design pattern,它用于通过继承和扩展来增强Component的功能。包含,与在简单地覆盖不可能或不合适的方法的情况下简单地扩展它相反。

Decorator pattern

答案 4 :(得分:-1)

你绝对可以。

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

至于如何在UML中表达这一点,我认为没有理由说你不能有两条线连接相同的两个盒子 - 毕竟,它确实有两个独立的关系。