有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java继承与组合

Possible Duplicate:
Prefer composition over inheritance?

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

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

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

所以我的问题是:

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

共 (1) 个答案

  1. # 1 楼答案

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

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

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

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