有人能提供一些关于何时通过ruby中的DelegateClass
(例如Seller < DelegateClass(Person)
)使用委托以及何时使用类继承(例如Seller < Person
)的信息吗?
class Seller < DelegateClass(Person)
def sales
...
end
end
class Seller < Person
def sales
...
end
end
当我查看github上的ruby on rails源代码时,我发现了不少uses of
DelegateClass
。 最佳答案
有两个不同之处可以帮助您了解使用哪种方法。
1)可以安全地委托给原语(例如string),但不能总是安全地从它们继承。
如果您是在Hash
或String
或Fixnum
上构建,那么使用DelegateClass
(或其他委托者)会更安全。关于原因的更多信息,Steve Klabnik's cautioning是一个很好的起点)。
2)delegateClass使“转换”更一般的对象成为更具体的对象变得容易
这样可以更容易地接受一般对象的实例,并使其以特定于您的实现的方式运行:
class Message < DelegateClass(String)
def print
upcase
end
end
# […]
def log(message)
message = Message.new(message) unless message.is_a?(Message)
end
3)一个gotcha:
DelegateClass
子类期望委托类的实例作为new
的参数这可能会使处理库代码的类“子类化”变得棘手。例如,这是一种相当常见的做法,在使用
DelegateClass
时是行不通的:class MyLogger < DelegateClass(ActiveSupport::Logger); end
Foo::ThirdParty::Library.configure do |c|
c.logger = MyLogger # no good
end
这不起作用,因为我们的库希望像大多数日志记录器一样,在没有参数的情况下实例化。这可以通过定义
initialize
并创建ActiveSupport::Logger
的实例来解决,但在这种情况下可能不是正确的解决方案。