【发布时间】:2021-04-15 18:39:36
【问题描述】:
有一个设计原则表明你应该更喜欢组合而不是继承,但是当我们想要使用多态性时,这不是真的吗?
例如,如果我们想为几个相关的对象做某事,我们可能想迭代一个 for-each-loop,只声明执行该方法的对象是-a some supertype,如何我们会使用组合来获得该功能和代码重用吗?
【问题讨论】:
标签: oop inheritance foreach polymorphism composition
有一个设计原则表明你应该更喜欢组合而不是继承,但是当我们想要使用多态性时,这不是真的吗?
例如,如果我们想为几个相关的对象做某事,我们可能想迭代一个 for-each-loop,只声明执行该方法的对象是-a some supertype,如何我们会使用组合来获得该功能和代码重用吗?
【问题讨论】:
标签: oop inheritance foreach polymorphism composition
在多态性与继承相关的静态类型语言中,可以通过两种方式实现继承:一种是有状态的,另一种是无状态的。这些可以分别称为实现继承和规范继承。例如,在 Java 中,类继承是有状态的,而接口继承是无状态的。
考虑到这一点,当《四人帮》书中说,
优先考虑对象组合而不是类继承。
...他们指的是有状态的继承。所以在遵循这个原则的情况下,仍然可以通过无状态继承来实现多态性,即使在静态类型语言中也是如此。
(在动态类型语言中,多态性和继承之间没有关系,因为多态性不需要显式类型声明。)
四人组担心的是这个。
...设计师经常过度使用继承作为一种重用技术,[但] 设计通常通过更多地依赖对象组合而变得更加可重用(并且更简单)。
我经常将其表述为“继承对于代码重用来说是一个糟糕的工具。”换句话说,不要使用继承来保留您的代码DRY。作曲更好。另一方面,无状态继承不是为了代码重用而设计的,它是一个很好的多态工具。
【讨论】: