2012-10-27 2 views
28

아마도 단순한 것이 누락되었지만 Ruby의 DelegateClass 메서드를 사용하는 방법을 이해하지 못했지만, SimpleDelegator 클래스 대신 사용할 수 있습니다. 예를 들어, 다음의 모든 대부분 동일하게 작동하는 것 : DelegateClass에 전달되는 클래스는 중요하지 않는 것 같습니다 것을SimpleDelegator 대신 Ruby DelegateClass를 사용하는 경우? (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] 

참고.

+0

입니다. 당신은 메시지를 보내고 응답을 담당 할 수업을 알지 못합니다. 위임자는 인식 할 수없는 모든 메시지를 전달하고 응답하지 않을지 여부를 모릅니다 (그렇지 않으면 하위 클래스로 구현되거나 구성을 사용할 수 있습니까?). 원래 클래스는 더 이상 아무 것도 제어하지 못하고 그 클래스와 다른 클래스 사이에 위임자가 있다는 것을 알지 못합니다. – Alexey

답변

21

고유 한 동작을하고 해당 수명 기간 동안 다른 객체에 위임하는 객체를 원할 때 SimpleDelegator 하위 클래스를 사용합니다.

만들고있는 클래스가 다른 개체를 가져 오지 않을 경우 기본적으로 DelegateClass를 사용한다고 말합니다. Ruby의 TempFile은 File 객체 만 꾸밀 것입니다. SimpleDelegator는 다른 객체에서 재사용 할 수 있습니다.

Example:

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" 

여기에 전체 위임자 패턴이 : 빠른 더러운 해킹처럼 나에게 보이는 몇 시간 동안 그것에 대해 생각 후 또 다른 좋은 설명 a-delegate-matter

+3

다른 * 유형 * 객체에 대해 'SimpleDelegator'를 재사용해서는 안됩니다. 다른 * 인스턴스에 대해서는 재사용해도 괜찮습니다. [docs] (http://ruby-doc.org/stdlib-2.1.0/libdoc/delegate/rdoc/SimpleDelegator.html#__setobj__-method)는'#__ setobj__'에 대해 명시 적으로 말합니다 : "이 점에 유의해야합니다 SimpleDelegator의 메서드가 변경되지는 않습니다 ... 아마도 위임을 원래 위임과 동일한 유형의 객체로만 변경하려고합니다. " – nickgrim