使用合成和继承时,避免使用Java中的菱形

时间:2015-05-13 22:52:02

标签: java inheritance interface composition

我一直在构建一个有五个类的系统,另一个类包含main方法来初始化,显示和修改上述五个类中的各种不同对象。我理解如何使用继承来从人的治疗师和患者类中采用字段(例如名称,地址phonenumber 字段)父类,以及如何使用组合(至少在理论上)来从患者班建立咨询对象和账单。

然而,我对如何在Therapist类中存储一个名为治疗师名称的字段感到困惑,并且在我称之为患者对象时显示出来。我已经包含了一个关于我认为应该如何的类图,但显然这形成了一个钻石,这在java中是一个很大的禁忌。像我班级图中的内容是否有效?

有没有人能够展示我如何将治疗师名称存储在Therapist类中,然后在创建对象时数据成员移动到患者身上? p>

这是一个图表:

link

2 个答案:

答案 0 :(得分:1)

Java并不存在钻石问题,因为Java只支持签名的多重继承,而不支持实现(虽然我不确定Java 8接口默认方法是如何工作的 - 我没有搞乱他们彻底了)。多继承实现语言中的菱形问题是指一个类通过两个不同的父类继承同一个祖父类的问题。例如,在C ++中,你要么让孙子有两个不同的祖父母实例(每个父类一个),所以你可以得到两个不同的结果,将你的对象转换为祖父母,这取决于演员来自哪个父母;或者你将拥有一个由父母双方共享的祖父母实例 - 他们可能会使用不同的语义来更新祖父母。

在这种情况下,如果要向therapistName添加Patient字段,只需添加一个名为therapistName的字段,并通过构造函数参数或设置器对其进行初始化。这里没问题。

底线:菱形模式对于多重继承实现只是禁忌,Java不支持(同样可能不包括接口默认方法)。由构图引起的钻石不是反模式,也不会引起你的痛苦,除了可能使初始化和/或处置逻辑更加麻烦。

答案 1 :(得分:0)

正如已经提到的关于你担心的钻石,我想对你的图表做一些标记。

检查下面的箭头。

关于你错误的构图,患者和治疗师之间的关系是一种聚合关系。一个组合关系你可以把它看作""的一部分。我在这里写了一个关于它的简单帖子,阅读:Is this an aggregation?

enter image description here