组合 vs 继承,多态呢?

Composition vs inheritance, what about polymorphism?

有一个设计原则说你应该更喜欢组合而不是继承,但是当我们想使用多态性时,这不是真的吗?

例如,如果我们想为几个相关的对象做某事,我们可能想迭代一个 for-each 循环,只声明执行该方法的对象是一个 some supertype,我们如何使用组合来获得该功能和代码重用?

在多态性与继承相关联的静态类型语言中,可以通过两种方式实现继承:一种方式是有状态的,另一种方式是无状态的。这些可以分别称为实现继承规范继承。例如,在 Java 中,class 继承是有状态的,而接口继承是无状态的。

考虑到这一点,当《四人帮》一书中说,

Favor object composition over class inheritance.

...他们指的是状态继承。所以在遵循这个原则的同时,仍然可以通过无状态继承来实现多态性,即使是在静态类型语言中。

(在动态类型语言中,多态和继承之间没有关系,因为多态不需要显式类型声明。)

四人帮担心的是这个

...designers often overuse inheritance as a reuse technique, [but] designs are often made more reusable (and simpler) by depending more on object composition.

我经常这样说,“继承是代码重用的一个糟糕工具。”换句话说,不要使用继承来保留你的代码 DRY .作文对此更好。另一方面,无状态继承不是为了代码重用而设计的,它是多态性的一个很好的工具。