【问题标题】:When to use delegation instead of inheritance? [closed]何时使用委托而不是继承? [关闭]
【发布时间】:2010-10-24 08:52:21
【问题描述】:

谁能解释一下我什么时候要使用委托而不是继承?

【问题讨论】:

标签: oop inheritance delegation


【解决方案1】:

当您想要“复制”/公开基类的 API 时,您可以使用继承。 当您只想“复制”功能时,请使用委托。

一个例子: 您想从列表中创建一个堆栈。 Stack 只有 pop、push 和 peek。您不应该使用继承,因为您不希望在 Stack 中使用 push_back、push_front、removeAt 等功能。

【讨论】:

    【解决方案2】:

    他们之间没有任何关系。委托是一种行为。继承是一种模型技术。

    继承用于建模“is-a”。计算机“是一个”电子系统。

    委托是方法提供结果的方式。有时一个对象会将工作委托给另一个对象。委托可以通过任何关系——您可以委托给超类、组合或聚合的成员或任何关系。

    【讨论】:

    • 继承用于建模“is-a”关系,但也用于子类扩展基类的功能并且不做任何限制的地方。
    • @Chadworthington:不正确;子类可以覆盖方法并替换它们——本质上是一种限制——而无需委托回超类。
    • @S.Lott:虽然您可以覆盖方法,但您必须小心覆盖所有暴露您想要限制的行为的方法 - 包括一些可能尚未编写的方法。 @Chadworthington 的建议更安全,尤其是当您不控制超类时。
    • 所以基本上,应该很容易确定何时要委托 - 困难在于决定是否通过继承来完成!
    • IMO 声称“他们彼此没有任何关系”是言过其实的。在创建模型时,是否使用“is a”而不是“has a”关系通常是一个难题。特别是因为所有“is a”关系都可以建模为“has a”关系。 Go 语言甚至没有完全依赖委托来重用代码的经典继承。
    【解决方案3】:

    您可以使用对多个内部类实例的委托来将它们的功能简化为一个公共分组。例如,如果您的语言没有实现多重继承,您可以从其中一个基础继承并包装另一个,将您想要公开的功能委托给底层实现。继承还将您的类与您所继承的类的层次结构联系起来,与委托一样,您可以在自己的层次结构中保留自己的位置并将调用委托给另一个。

    【讨论】:

      【解决方案4】:

      假设您的类称为 B 并且派生/委托给类称为 A 然后

      以下是一些使用继承或委托的示例:
      如果

      • 你想表达关系(is-a)然后你想使用继承。
      • 您希望能够将您的类传递给期望 A 的现有 API,那么您需要使用继承。
      • 您想增强 A,但 A 是最终的并且不能进一步子类化,那么您需要使用组合和委托。

      【讨论】:

        【解决方案5】:

        在我看来,委托可以在需要使用时调用,并且继承是嵌入的。

        the in_threads gem 为例,它使用 InThreads 委托器来实现任何 Ruby Enumerable 模块的线程。这样,只需要在数组上调用 in_threads 方法,它就会在线程中运行。

        【讨论】:

          【解决方案6】:

          我同意@Anzurio。简单来说就是:

          仅当您认为新类是现有类的自然扩展时才使用继承。更喜欢将组合/委托用于所有其他目的,例如使用特定方法等。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-01-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-07-07
            • 2011-07-12
            • 1970-01-01
            相关资源
            最近更新 更多