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