java - 继承与组合

标签 java inheritance composition

<分区>

Possible Duplicate:
Prefer composition over inheritance?

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

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

因此,我无法想象,我们究竟如何能够依赖它。父类(super class)作者可能希望提高性能,而我们的客户端代码可能会崩溃。

所以我的问题是:

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

最佳答案

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

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

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

当您的类与其他类之间存在 is-a 关系时,将使用继承。当您的类(class)与其他类(class)之间存在关系时,将使用组合。

关于java - 继承与组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11031843/

相关文章:

python:仅覆盖抽象类中的一些方法

unit-testing - 将 SWI-Prolog 代码构建到模块中,用于多个算法和数据集的单元测试

c# - 继承基类的 XMLType

java - 在 Java 中传递文件参数

java - 在java中将文件放入链表中

java - Eclipse启动异常(ChooseWorkspaceData.writePersistedData中的java.lang.ArrayIndexOutOfBoundsException)

c# - 如何在 C# 中正确实例化动态派生对象及其成员

C++ 组合与迭代器

c# - CompositionContainer.SatisfyImportsOnce 是否重用组件?

java - 如何最好地打包一个网站