【问题标题】:Composition vs inheritance, what about polymorphism?组合与继承,多态呢?
【发布时间】:2021-04-15 18:39:36
【问题描述】:

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

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

【问题讨论】:

    标签: oop inheritance foreach polymorphism composition


    【解决方案1】:

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

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

    优先考虑对象组合而不是类继承。

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

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

    四人组担心的是这个。

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

    我经常将其表述为“继承对于代码重用来说是一个糟糕的工具。”换句话说,不要使用继承来保留您的代码DRY。作曲更好。另一方面,无状态继承不是为了代码重用而设计的,它是一个很好的多态工具。

    【讨论】:

      猜你喜欢
      • 2011-05-20
      • 1970-01-01
      • 1970-01-01
      • 2014-01-17
      • 2015-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多