【发布时间】:2014-08-09 00:44:20
【问题描述】:
我知道委托方法调用有三种方式。
- SimpleDelegator
- 使用委托类
- 使用抽象类 Delegator
我知道什么是委托以及它是如何工作的。我知道如何使用 SimpleDelegator 委托方法调用。但我不确定何时使用它们。谁能给我一些关于何时使用它们的提示。以及如何使用 DelegateClass 完成委托。
【问题讨论】:
标签: ruby delegates delegation
我知道委托方法调用有三种方式。
我知道什么是委托以及它是如何工作的。我知道如何使用 SimpleDelegator 委托方法调用。但我不确定何时使用它们。谁能给我一些关于何时使用它们的提示。以及如何使用 DelegateClass 完成委托。
【问题讨论】:
标签: ruby delegates delegation
SimpleDelegator 只是Delegator 的基本实现。 DelegateClass 实际上是一个定义委托类的方法。 Delegator 通过 method_instance 进行委托,DelegateClass 创建了一个新类,该类实现了与超类提供给它的 API 相同的 API。
所以,当你不需要任何特别的东西时,你会选择SimpleDelegator:
class AuthorDecorator < SimpleDelegator
def hi!
"Hi, #{name}!"
end
end
# assuming author is an object that responds to :name method
AuthorDecorator.new(author).hi! # => "Hi, Rohan!"
如果您想实现更复杂的东西,例如您想完全控制 __setobj__ 和 __getobj__ 方法(例如类型强制),您可以使用 Delegator。
正如我上面所说,DelegateClass 准备了一个带有预定义方法的委托类。这里的区别在于,当您使用SimpleDelegator 或Delegator 时,它依赖于method_missing,因此如果您的委托者没有请求的方法,它将通过method_missing 代理到委托对象。如果准备了带有DelegateClass 的基类,则将有已经定义的方法将在委托对象上调用相同的方法。所以DelegateClass 提供了一种更有效的委派方式。
【讨论】: