¿Cuándo usar Ruby DelegateClass en lugar de SimpleDelegator?(Método DelegateClass vs. clase SimpleDelegator)
design-patterns delegation (1)
Probablemente me esté perdiendo algo simple, pero no entiendo cómo usar el método DelegateClass
de Ruby, quiero decir cuándo usarlo en lugar de la clase SimpleDelegator
. Por ejemplo, todo lo siguiente parece funcionar de manera casi idéntica:
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]
Tenga en cuenta que no parece importar qué clase se pasa a DelegateClass
.
Use la subclase SimpleDelegator cuando desee un objeto que tenga su propio comportamiento y delegue en diferentes objetos durante su vida útil.
Esencialmente, decir usar DelegateClass cuando la clase que estás creando no va a obtener un objeto diferente. TempFile en Ruby solo va a decorar un objeto File SimpleDelegator puede ser reutilizado en diferentes objetos.
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"
Aquí hay otra buena explicación a-delegate-matter