何时使用委托而不是继承?

时间:2009-05-07 01:37:20

标签: oop inheritance delegation

有人可以解释我何时想使用委托而不是继承?

6 个答案:

答案 0 :(得分:57)

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

这方面的一个例子: 您想要从列表中创建堆栈。堆栈只有pop,push和peek。鉴于您不希望在堆栈中使用push_back,push_front,removeAt等等功能,您不应该使用继承。

答案 1 :(得分:26)

他们彼此无关。授权是一种行为。继承是一种模型技术。

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

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

答案 2 :(得分:4)

您可以将委托用于多个内部类实例,以将其功能简化为通用分组。如果您的语言没有实现多重继承,那么您可以从其中一个基础继承并包装另一个,将您要公开的功能委托给底层实现。继承还会将您的类绑定到您继承的类的层次结构中,您可以将其保存在自己的层次结构中,并将调用委托给另一个层次。

答案 3 :(得分:3)

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

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

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

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

我同意@Anzurio。只是简单地解释一下:

  

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