有人能提供一些关于何时通过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),但不能总是安全地从它们继承。
如果您是在HashStringFixnum上构建,那么使用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的实例来解决,但在这种情况下可能不是正确的解决方案。

09-11 13:07