Oop 组合与继承,多态性如何?

Oop 组合与继承,多态性如何?,oop,inheritance,foreach,polymorphism,composition,Oop,Inheritance,Foreach,Polymorphism,Composition,有一个设计原则指出,您应该支持组合而不是继承,但当我们想要利用多态性时,这不是真的吗 例如,如果我们想为几个相关的对象做一些事情,我们可能想迭代一个For-each循环,只声明执行该方法的对象是某个超类型,我们如何使用组合获得该功能和代码重用?在多态性与继承相关联的静态类型语言中,这种继承可以通过两种方式实现:一种是有状态的,另一种是无状态的。这些可以分别称为实现继承和规范继承。例如,在Java中,类继承是有状态的,而接口继承是无状态的 考虑到这一点,当《四人帮》一书说 支持对象组合而不是类继承

有一个设计原则指出,您应该支持组合而不是继承,但当我们想要利用多态性时,这不是真的吗


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

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

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

支持对象组合而不是类继承

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

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

“四人帮”担心的是这个

…设计师经常过度使用继承作为一种重用技术,[但是]通过更多地依赖对象组合,设计往往变得更可重用(更简单)

我经常这样说,“继承对于代码重用来说是一个糟糕的工具。”换句话说,不要使用继承来保存代码。构图更好。另一方面,无状态继承并不用于代码重用,它是多态性的一个很好的工具