关于oop:何时使用委托而不是继承?

When to use delegation instead of inheritance?

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


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

其中一个例子:要从列表中创建堆栈。堆栈只有pop、push和peek。您不应该使用继承,因为您不希望在堆栈中使用"后推"、"前推"、"删除"等类似功能。


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

继承用于建模"IS-A"。计算机"IS-A"电子系统。

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


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


假设您的类被称为B,并且派生/委托给类被称为A,那么

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

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

在我看来,委托可以在使用的时候被调用,继承永远被嵌入。

以in_线程gem为例,它使用in threads delegator为任何Ruby可枚举模块实现线程。这样,只有在数组中调用线程方法,它才会在线程中运行。


我同意@anzurio。简单地解释一下:

Use inheritance only when you feel like the new class is a natural extension of the existing class. Prefer to use composition/delegation for all other purposes like using a specific method, etc.