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

Is it bad programming practice to relate two objects with both inheritance and aggregation?

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

显然有一个聚合关系是有意义的,class 1 的一个实例包含在 class 2 中。但是在我的使用中,通常还考虑 class 2 作为 class 1 的更大实例(类似于电池组也可以被认为是单个电池)。

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

这是常做的事吗?我对编程很陌生,但还没有看到父子之间有两条单独的线的 UML 图 class。我的方法是否是糟糕的编程实践,是否有更好的表示此类关系的方法?

你可以在这里使用composite pattern

如果我没理解错的话,你描述的模式听起来像是一种叫做 "composite" 的模式——这并不罕见,也不是坏习惯 have a look here

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

我认为 Class1 和 Class2 之间没有任何继承关系。之所以(我想在class2中使用class1方法)不足以使用Inheritance。您可以将 Class1 方法仅通过 Class1 的实例转换为 Class2。只是聚合。

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

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