关于Java:继承与合成Inheritance vs Composition

Inheritance vs Composition

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Prefer composition over inheritance?

我想知道,当有这么多的缺点时,为什么(或在哪种情况下)应该考虑继承而不是组合:

  • 如果我们在调用超类方法的子类中实现/重写一个方法,就不能保证我们的超类的另一个版本(可能是一些库)不会破坏我们的代码。
  • 如果在超类中出现一个与子类方法具有相同签名的新方法,但返回类型不同,则我们的类将不会编译。

因此,我无法想象,我们究竟是如何依靠它的。超类作者可能希望提高性能,我们的客户机代码可能会崩溃。

所以我的问题是:

  • 这些问题是如何解决的(例如在标准Java库中)?
  • 什么时候使用继承和组合?


您的第一个反对意见也适用于组合:如果您调用的方法的实现发生了变化,就不能保证您的代码不会被破坏。

第二个反对意见实际上是一件好事,因为您会立即注意到新版本的API有问题。

这个问题与继承/组合没有太多关系。如果一个类的公共契约从一个版本更改为另一个版本,则必须对代码进行更改以适应这些更改。通过避免向后不兼容的更改来解决问题。提供一个新的API可能是解决方案(例如,参见IO,后面是NIO,后面是NIO2)。否则,发行说明和迁移文档可以帮助从一个版本的API转换到另一个版本。

当您的类和另一个类之间存在is-a关系时,就会使用继承。当你的班级和另一个班级之间有"有"关系时,就用作文。