继承与组合

时间:2012-06-14 11:10:19

标签: java inheritance composition

  

可能重复:
  Prefer composition over inheritance?

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

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

因此,我无法想象,地球上我们如何依赖它。超类作者可能希望提高性能,我们的客户端代码可能会崩溃。

所以我的问题是:

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

1 个答案:

答案 0 :(得分:6)

您的第一个异议也适用于组合:如果您调用的方法的实现发生变化,则无法保证您的代码不会中断。

第二个异议实际上是一件好事,因为您会立即注意到新版本的API存在问题。

问题与继承/组合没有太大关系。如果类的公共合同在不同版本之间发生变化,则必须对代码进行更改以适应这些更改。通过避免向后不兼容的更改来解决该问题。提供新的API可以是解决方案(例如,参见io,然后是nio,然后是nio2)。否则,发行说明和迁移文档可帮助您从一个版本的API转换到另一个版本。

当您的类与另一个类之间存在is-a关系时,将使用继承。当您的类与另一个类之间存在has-a关系时,将使用组合。