DelegateClass与Ruby中的类继承

Kyl*_*cot 12 ruby inheritance delegation

有人可以提供一些见解,了解何时通过DelegateClass(例如Seller < DelegateClass(Person))使用委托以及何时Seller < Person在ruby中使用类继承(例如)?

class Seller < DelegateClass(Person)
  def sales
     ...
  end 
end 

class Seller < Person 
  def sales
     ...
  end 
end 
Run Code Online (Sandbox Code Playgroud)

当我在Github上查看Ruby on Rails源代码时,我发现了很多用途DelegateClass.

cor*_*ard 7

有一些差异可以帮助提供有关使用哪种方法的见解.

1)您可以安全地委托给基元(例如String),但不能总是安全地从它们继承

如果你在上面建造HashString或者Fixnum,你是更安全的使用DelegateClass(或其他委托).有关原因的更多信息,Steve Klabnik的警告是一个很好的起点).

2)DelegateClass可以很容易地将更通用的对象"转换"为更具体的对象

这样可以更容易地接受一般对象的实例,并使其以特定于您的实现的方式运行:

class Message < DelegateClass(String)
  def print
    upcase
  end
end

# […]

def log(message)
  message = Message.new(message) unless message.is_a?(Message)
end
Run Code Online (Sandbox Code Playgroud)

3)一个陷阱:DelegateClass子类期望委托类的实例作为参数new

这可能会使您将要传递给库代码的类"子类化"变得棘手.例如,这是一种相当普遍的做法,不会开箱即用DelegateClass:

class MyLogger < DelegateClass(ActiveSupport::Logger); end

Foo::ThirdParty::Library.configure do |c|
  c.logger = MyLogger # no good
end
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为我们的库期望像大多数记录器一样运行并且不带参数进行实例化.这可以通过定义initialize和创建一个实例来解决ActiveSupport::Logger,但在这种情况下可能不是正确的解决方案.