53

有人可以解释一下我什么时候想使用委托而不是继承?

4

6 回答 6

69

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

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

于 2009-05-07T01:40:15.873 回答
32

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

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

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

于 2009-05-07T01:41:57.023 回答
4

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

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

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

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

于 2009-05-07T01:47:38.027 回答
1

我同意@Anzurio。用简单的话来解释一下:

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

于 2018-09-06T09:07:48.263 回答
1

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

in_threads gem为例,它使用 InThreads 委托器为任何 Ruby Enumerable 模块实现线程。有了这个,只在数组上调用 in_threads 方法,它将在线程中运行。

于 2015-10-25T05:33:45.467 回答