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

时间:2017-12-22 12:46:46

标签: inheritance uml aggregation

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

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

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

这是常见的事吗?我对编程很陌生,但没有看到一个UML图,在父类和子类之间有两条独立的行。我的方法是不好的编程实践,是否有更好的代表这种关系?

4 个答案:

答案 0 :(得分:4)

如果我理解你的话,你所描述的模式听起来就像一个名为"复合" - 这并不罕见,也不是不好的做法have a look here

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:-1)

您可以在此处使用composite pattern