Ruby Socket Inheritance - PullRequest
       10

Ruby Socket Inheritance

1 голос
/ 30 мая 2010

Я пишу класс Ruby, который расширяет TCPSocket. Предположим, это выглядит примерно так:

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, в качестве параметра. Тем не менее, мне интересно знать, как сделать это с помощью наследования - я пытался сосредоточиться на этом, но не могу понять.

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 30 мая 2010

Я думаю, что самый простой способ сделать это - сделать FooSocket модулем, а затем extend его в ваши TCPSocket s, которые нуждаются в специальных методах. Вот несколько примеров того, как это можно использовать:

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 голосов
/ 30 мая 2010

Вам нужно переопределить accept в классе TCPServer, чтобы вернуть FooSocket вместо TCPSocket, либо путем повторного открытия класса, либо создания подкласса и использования этого.Думаю, ваша идея нарядить экземпляр TCPSocket после того, как он был возвращен accept, выглядит чище.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...