2012-10-27 26 views
28

Có lẽ tôi đang thiếu một cái gì đó đơn giản, nhưng tôi không hiểu làm thế nào để sử dụng phương pháp DelegateClass của Ruby, tôi có nghĩa là khi sử dụng nó thay vì SimpleDelegator lớp. Ví dụ, tất cả những điều sau đây dường như làm việc chủ yếu là giống nhau:Khi nào nên sử dụng Ruby DelegateClass thay vì SimpleDelegator? (DelegateClass method so với SimpleDelegator class)

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] 

Lưu ý rằng nó dường như không quan trọng mà lớp được truyền cho DelegateClass.

+0

Sau khi suy nghĩ về nó một thời gian, toàn bộ mẫu người ủy nhiệm vẻ với tôi như một bẩn hack nhanh :). Bạn gửi một tin nhắn, và bạn không biết lớp nào sẽ chịu trách nhiệm trả lời. Người ủy nhiệm đi qua tất cả các tin nhắn mà nó không nhận ra mà không biết liệu họ có được trả lời hay không (nếu không nó có thể được nhận ra như một phân lớp, hoặc sử dụng bố cục, phải không?). Lớp học ban đầu không thực sự kiểm soát bất cứ điều gì nữa và thậm chí không biết có một đại biểu giữa nó và phần còn lại của thế giới. – Alexey

Trả lời

21

Sử dụng phân lớp SimpleDelegator khi bạn muốn một đối tượng có cả hành vi riêng và đại biểu cho các đối tượng khác nhau trong suốt cuộc đời.

Về cơ bản, hãy sử dụng DelegateClass khi lớp bạn đang tạo sẽ không nhận được đối tượng khác. TempFile trong Ruby sẽ chỉ trang trí đối tượng Tệp SimpleDelegator có thể được sử dụng lại trên các đối tượng khác nhau.

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" 

Dưới đây là một lời giải thích tốt a-delegate-matter

+3

Bạn không nên sử dụng lại 'SimpleDelegator' cho các loại * đối tượng khác nhau, mặc dù có thể tái sử dụng cho các trường hợp * khác nhau *; [tài liệu] (http://ruby-doc.org/stdlib-2.1.0/libdoc/delegate/rdoc/SimpleDelegator.html#__setobj__-method) nói rõ ràng về '#__ setobj__':" Điều quan trọng cần lưu ý là không làm cho các phương thức của SimpleDelegator thay đổi. ... bạn có thể chỉ muốn thay đổi ủy quyền cho các đối tượng cùng loại với ủy nhiệm ban đầu. " – nickgrim

Các vấn đề liên quan