何时使用Ruby DelegateClass而不是SimpleDelegator?(DelegateClass方法与SimpleDelegator类)

Ale*_*xey 29 ruby design-patterns delegation

可能我错过了一些简单的东西,但我不明白如何使用Ruby的DelegateClass方法,我的意思是何时使用它而不是SimpleDelegator类.例如,以下所有内容似乎大部分相同:

require 'delegate'

a = SimpleDelegator.new([0])
b = DelegateClass(Array).new([0])
c = DelegateClass(String).new([0])
a << 1
b << 2
c << 3
p a # => [0, 1]
p b # => [0, 2]
p c # => [0, 3]
Run Code Online (Sandbox Code Playgroud)

请注意,传递给哪个类似乎并不重要DelegateClass.

jtz*_*ero 22

如果希望对象具有自己的行为并在其生命周期内委托给不同的对象,请使用子类SimpleDelegator.

基本上说当你创建的类不会得到不同的对象时使用DelegateClass. Ruby中的TempFile只会修饰一个File对象,SimpleDelegator可以在不同的对象上重用.

例:

require 'delegate'


class TicketSeller
  def sellTicket()
    'Here is a ticket'
  end
end


class NoTicketSeller
  def sellTicket()
    'Sorry-come back tomorrow'
  end
end


class TicketOffice < SimpleDelegator
  def initialize
    @seller = TicketSeller.new
    @noseller = NoTicketSeller.new
    super(@seller)
  end
  def allowSales(allow = true)
    __setobj__(allow ? @seller : @noseller)
    allow
  end
end

to = TicketOffice.new
to.sellTicket   »   "Here is a ticket"
to.allowSales(false)    »   false
to.sellTicket   »   "Sorry-come back tomorrow"
to.allowSales(true)     »   true
to.sellTicket   »   "Here is a ticket"
Run Code Online (Sandbox Code Playgroud)

这是另一个很好的解释a-delegate-matter

  • 你不应该为不同的*类型*对象重用一个`SimpleDelegator`,尽管可以重用不同的*实例*; [文档](http://ruby-doc.org/stdlib-2.1.0/libdoc/delegate/rdoc/SimpleDelegator.html#__setobj__-method)明确说出`#__ setobj__`:"重要的是要注意这一点不会导致SimpleDelegator的方法发生变化....你可能只想将委托更改为与原始委托相同类型的对象." (4认同)