2

可能重复:
更喜欢组合而不是继承?

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

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

因此,我无法想象,我们究竟如何依赖它。超类作者可能想要提高性能,而我们的客户端代码可能会崩溃。

所以我的问题是:

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

1 回答 1

6

您的第一个反对意见也适用于组合:如果您调用的方法的实现发生更改,则无法保证您的代码不会中断。

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

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

当您的类和其他类之间存在 is-a 关系时,使用继承。当您的班级和其他班级之间存在具有关系时,使用组合。

于 2012-06-14T11:18:23.003 回答