2010-05-29 118 views
1

我正在寫一個擴展TCPSocket的Ruby類。假設它看起來是這樣的:Ruby Socket繼承

class FooSocket < TCPSocket 
    def hello 
     puts 'hello' 
    end 
end 

我有一個TCPServer偵聽傳入連接

server = TCPServer.new 1234 
socket = server.accept 

當我的服務器終於接受連接,它會返回一個TCPSocket。不過,我想要一個FooSocket,以便我可以撥打socket.hello

如何將TCPSocket更改爲FooSocket

我可以將我想要的方法和屬性直接打到TCPSocket類上,但我在其他地方使用它,所以我不想這樣做。

也許最簡單的解決方法是編寫一個封裝TCPSocket的類,並將accept返回的套接字作爲參數傳遞。然而,我很想知道如何通過繼承來實現它 - 我一直在試圖繞過它,但無法弄清楚。

在此先感謝。

回答

1

我認爲最簡單的方法是將FooSocket作爲一個模塊,然後將extend轉換成需要特殊方法的TCPSocket。下面是如何這可以用於一些例子:

module FooSocket 
    def hello 
    self.puts 'hello' # could also be written without the 'self', 
    end     # but it is clearer this way because it may 
end     # be mistaken for the Kernel method. 

server = TCPServer.new 1234 
socket = server.accept.extend FooSocket 

你也可以很容易地覆蓋TCPServer返回的其中之一:

class TCPServer 
    alias old_accept accept 
    def accept 
    old_accept.extend FooSocket 
    end 
end 

如果你不想重載標準類,你可以在你的服務器上定義一個單例類(這是我要做的),因爲你很可能只有一個服務器。爲此,請將上例中的class TCPServer行替換爲class << server

0

你會需要重寫acceptTCPServer類返回的FooSocket代替TCPSocket,或者通過重新打開類或子類和使用。你認爲在accept歸還TCPSocket後,我認爲它更清潔。