支持组合而不是继承

2022-08-31 16:06:54

支持组合而不是继承

是非常流行的短语。我读了几篇文章,最后每篇文章都说

当类之间存在纯 IS-A 关系时,请使用继承。

本文中的示例:

苹果水果之间有明确的IS-A关系,即苹果IS-A水果,但作者也将其显示为苹果HAS-A水果(成分),以显示用继承实现时的陷阱。

我在这里变得有些困惑,声明的含义是什么

当类之间存在纯 IS-A 关系时,请使用继承。

使用组合而不是继承是否意味着即使存在纯IS-A关系也始终尝试应用组合,并且仅在组合没有意义的情况下保留继承?


答案 1

当您使用继承来重用超类中的代码,而不是重写方法并定义另一个多态行为时,这通常表明您应该使用组合而不是继承。

该类是继承使用不当的一个很好的例子。它不是使用 Hashtable 来存储其属性,而是扩展 Hashtable,以便重用其方法并避免使用委托重新实现其中一些方法。java.util.Properties


答案 2

我认为这是面向对象设计中讨论最多的一点。正如文章中所建议的那样,组合总是优先于继承。这并不意味着你永远不应该使用继承。你应该在更有意义的地方(这可能值得商榷)。

使用组合有很多优点,其中有几个是:

  • 您将完全控制您的实现。也就是说,您只能公开要公开的方法。
  • 超类中的任何更改都可以通过仅在类中进行修改来屏蔽。任何使用您的类的客户端类都不需要进行修改。
  • 允许您控制何时加载超类(延迟加载)

推荐