什么时候倾向于继承而不是组合

When to Favor Inheritance Over Composition

这道题看似重复,实则不然。我用谷歌搜索,总线无法获得概念上的清晰度。有很多 Animal,Cars 种类的例子。但是,我想了解基本逻辑。 通常来说,组合优先于继承,因为它提供了许多优点。在那种情况下,为什么继承被提供为 OOP 的主要概念之一。 我的问题是什么时候更倾向于继承而不是组合?

简而言之,

如果是is-a关系使用继承。当它是 has-a 关系时使用组合。

继承是完美的,只要没有改变。但是当您倾向于 extend/modify 以后 类 的行为时,您将面临很多继承问题。

你往往会打破你最初的假设,你需要在很多地方做出改变。如果你使用组合,你可以避免所有这些修复。

我认为核心概念比更改、可维护性等更重要。在给定情况下,Is A 关系似乎比 Has A 关系更好吗?

推荐读物:Gang Of Four 在开始讨论模式之前讨论类型、接口、OOP 等。

另请查看: Composition vs. Inheritance: How to Choose?

如果您使用的语言没有多重继承,您应该始终支持组合而不是继承。

在没有多重继承的语言中(Java、C#、Visual Basic.NET),引入一个继承层次结构会自动将您排除在所有其他替代继承层次结构之外。在这些语言中,继承只会把你锁在里面。

通过组合,您可以做继承可以做的所有事情,也可以做一些继承不能做的事情,例如模拟多个继承继承。

让 class 实现多个接口本质上是从任何客户端的角度模拟多重继承。

为了可重用性,将 class 与多个依赖项组合基本上解决了来自多个基础 classes 的 'inheriting' 问题。

继承最初作为一个概念包含在 OOP 中,因为 OOP 最初是根据多重继承来描述的。参见例如Object-Oriented Software Construction,从 Eiffel 的角度解释了 OOP - 一种具有多重继承的编程语言。