将两个对象与继承和聚合相关联是不好的编程习惯吗?

Posted

技术标签:

【中文标题】将两个对象与继承和聚合相关联是不好的编程习惯吗?【英文标题】:Is it bad programming practice to relate two objects with both inheritance and aggregation? 【发布时间】:2018-06-05 03:01:55 【问题描述】:

我有一个代表电子设备的类(我们称之为 1 类)。我还有一个代表多个设备的类,本质上是一组连接在一起的设备(第 2 类)。

显然,有一个聚合关系是有意义的,其中类 1 的实例包含在类 2 中。但是在我的用法中,通常也将类 2 视为类 1 的更大实例(以类似的方式一组电池也可以被认为是单个电池)。

这意味着我想在类 2 中重用类 1 的所有方法和属性,同时还添加一些额外的方法和属性。在我看来,这意味着继承关系也有意义:但是其中一些属性是从嵌入的父对象派生的,而不是由用户定义的。

这是通常做的事情吗?我对编程很陌生,但还没有看到在父类和子类之间有两条单独的线的 UML 图。我的方法是不好的编程习惯吗?是否有更好的表示这种关系的方法?

【问题讨论】:

如果可能,我更倾向于聚合而不是继承。在这种情况下,您可以只删除您的 class2 并在其中使用带有自身列表的 class1。就像一棵树。我从来没有在聚合的同时需要继承。 【参考方案1】:

如果我理解正确,您描述的模式听起来像是一种称为“复合”的模式 - 这并不罕见,也不是坏习惯have a look here。

一般来说你是对的,尽量保持类之间的耦合尽可能低(在这方面继承真的很强大)。但是,如果它有意义并且易于理解您的代码,请以这种方式实现它。对模式和技术要务实。如果继承有意义并且真正模拟了类之间的关系,那么就使用它。

【讨论】:

【参考方案2】:

我唯一要补充的是,原则上,两种类型之间存在不止一种关系并没有错,这完全取决于您的具体情况。在你的情况下,它只是意味着 2 类是 1 类的一种,而 2 类聚合了 1 类。换句话说,它是一种 1 类,可以聚合更多的 1 类。因此,这可以使用两个类之间的聚合和泛化来表示。但是,我同意其他受访者的观点,在您的情况下,我不确定这是一个很棒的设计,因为 Class 2 实际上并不是 Class 1 的一种,您只是使用继承来重用代码,您可能会这样做最好将类进一步分解为它们的复合部分,并以这种方式促进重用。您可以考虑一个接口来定义您希望 Class 2 实现的 Class 1 的共同特征,以便可以对它们进行多态处理。

【讨论】:

【参考方案3】:

我相信 Class1 和 Class2 之间没有任何继承。原因(我想在class2中使用class1方法)不足以使用继承。您可以将 Class1 方法仅由 Class1 的实例转换为 Class2。这只是聚合。

例如,如果我们想在一个类中使用 String 数组,我们不继承 String。再举一个例子,(来自现实世界),一本书不是一种纸,或者公寓不是一种房间。一群人不是一个人。

【讨论】:

【参考方案4】:

您可以在此处使用composite pattern。

【讨论】:

以上是关于将两个对象与继承和聚合相关联是不好的编程习惯吗?的主要内容,如果未能解决你的问题,请参考以下文章

使用指针将数组中的两个对象(每个对象与一个类)相关联

OOP 中的 组合聚合和关联有什么区别?

java中类与类之间的关系讲解

java中类与类之间的关系有依赖和继承,那么这两种关系哪个效率高?

将模型 A 与模型 B 和模型 B 的关联关联起来

第八章 聚合与继承