对象组合对类继承的缺点

How*_*ard 14 java oop design-patterns

大多数设计图书说我们应该"赞成对象组合而不是类继承".

但是,任何人都可以给我一个例子,继承比对象组合更好.

mat*_*t b 13

继承适用于is-a关系.这种has-a关系不适合.

由于类/组件之间的大多数关系属于has-a存储桶(例如,一个Car类可能不是一个类HashMap,但它可能有一个HashMap),因此它遵循组合通常更好地建模类之间的关系而不是继承.

这并不是说继承对某些场景没有用或者不是正确的解决方案.


Buh*_*ndi 7

我的简单回答是你应该将继承用于行为目的.子类应覆盖方法以更改方法和对象本身的行为.

本文(采访GoF之一的Erich Gamma)清楚地阐述了为什么赞成对象组合而不是类继承.


pra*_*pes 5

在Java中,每当您从一个类继承时,您的新类也将自动成为原始类类型的子类型。由于它是子类型,因此需要遵守Liskov替换原则
原则上说,您必须能够在需要超型的任何地方使用子类型。这严重限制了新继承的类的行为与原始类的行为有何不同。
虽然没有编译器能够使您遵守该原则,但是如果您不这样做,则会遇到麻烦,尤其是在其他程序员正在使用您的类时。

在允许子类化而不进行子类型化的语言中(例如CZ语言),规则“从继承性出发考虑对象的组成”并不像Java或C#这样的语言那么重要。

  • 我喜欢这个问题的作者,表明他想得到与所问相反的答案。我们被要求提供一个反例,在这种情况下继承会更合适。但是,他必须放弃并接受另一个继承再次失败的例子。这是一个谜。OOP统治着世界,但是,绝不能使用其主要特征继承来支持旧的良好结构组成!也许由于多态性是通过Java中(总是)不良继承来实现的,所以我们也应该更喜欢条件而不是多态性吗? (2认同)