假设有两个类,类B
是子类A
而B
有一个属性a
,它是A
的一种,作为伪代码下面显示:
class A {}
class B extends A {
A a;
}
在UML词中,类B
和类A
之间存在两种关系。 B
'是A
,而B
'具有A
的属性。我可以在一个类图中同时表示这些关系吗?
当我谷歌这个时,通常在所有结果中两个类之间只存在一个关系。所以我不确定是否允许这样画图。如果没有,UML如何在类之间表达这种关系。
答案 0 :(得分:3)
当然有可能。例如:人类是一种动物,可以将动物作为宠物。 (虽然人们可能想要禁止人类作为宠物的规则。:-))
然而, 工作的一件事是制作最小基数1.这意味着每个宠物也必须有宠物!请注意您的文本,伪代码和UML不匹配。你的UML图使用组合,这意味着当我的例子中的宠物死亡时,所有者也必须死!要解决此问题,您可以使用白色钻石。
答案 1 :(得分:1)
这方面的经典例子是:
A =件 B = CompositePiece(由其他部分组成,无论是复合材料还是非复合材料)
答案 2 :(得分:1)
是的,尽管很少见,但这是可能的。请记住,类是一个抽象实体,可以有几个不同的实例,允许我们拥有这样的结构。
例如,包含圆圈的红色圆圈:
class Circle {}
class RedCircle extends Circle {
Circle a;
//...
//more stuff for the red property
}
答案 3 :(得分:1)
此方法最常见的应用之一称为Composite design pattern,通常用于表示树状数据结构。
此模式不仅可以表示树(层次结构),还可以有效地统一处理它(通过适当的 operation()实现)。
修改强>
在写这个答案时,我完全忘记了另一个广泛使用的Decorator design pattern,它用于通过继承和扩展来增强Component的功能。包含,与在简单地覆盖不可能或不合适的方法的情况下简单地扩展它相反。
答案 4 :(得分:-1)
你绝对可以。
您可以使用它的一个示例是某种自定义LinkedList,您希望每个节点由于某种原因成为不同的子类。在这种情况下,节点将属于类型节点,但也包含对下一个/上一个节点的引用。
至于如何在UML中表达这一点,我认为没有理由说你不能有两条线连接相同的两个盒子 - 毕竟,它确实有两个独立的关系。