为什么要使用继承?[已关闭]
我知道这个问题以前讨论过,但似乎总是假设继承至少有时比组合更可取。我想挑战这个假设,希望能得到一些理解。
我的问题是这样的:既然你可以用对象组合完成任何经典继承,既然经典继承经常被滥用[1],既然对象组合可以让你灵活地更改委托对象运行时,那么你为什么要使用经典继承呢?
我可以理解为什么你会建议在一些语言(如Java和C++)中进行继承,这些语言不提供方便的委派语法。在这些语言中,您可以使用继承来节省大量键入,只要这样做没有明显不正确。但是像Objective C和Ruby这样的其他语言既提供了经典的继承,也为委派提供了非常方便的语法。据我所知,Go 编程语言是唯一一种认为经典继承比它的价值更麻烦的语言,它只支持代码重用的委派。
另一种表达我问题是:即使你知道经典继承对于实现某个模型来说并不是不正确的,那么这个理由是否足以使用它而不是组合?
[1]许多人使用经典继承来实现多态性,而不是让他们的类实现接口。继承的目的是代码重用,而不是多态性。此外,有些人使用继承来模拟他们对“is-a”关系的直观理解,这通常是有问题的。
更新
我只是想澄清一下,当我谈论继承时,我到底是什么意思:
我说的是一种继承,即类从部分或完全实现的基类继承。我不是在谈论从纯抽象基类继承,这与实现接口是一回事,我记录在案并不反对。
更新 2
我理解继承是实现多态性的唯一途径,C++。在这种情况下,很明显为什么你必须使用它。因此,我的问题仅限于Java或Ruby等语言,它们提供了实现多态性的不同方法(分别是接口和鸭子类型)。