Вызовы метода переадресации Ruby - PullRequest
4 голосов
/ 31 мая 2010

У меня есть экземпляр мастер-класса, который генерирует экземпляры подкласса, эти подклассы должны перенаправлять вызовы некоторых методов обратно в мастер-экземпляр.

В данный момент у меня есть код, похожий на этот, но мне кажется, что я должен быть в состоянии сделать то же самое более эффективно (возможно, с method_missing?)

class Master
  def initalize(mynum)
    @mynum = mynum
  end

  def one_thing(subinstance)
    "One thing with #{subinstance.var} from #{@mynum}"
  end

  def four_things(subinstance)
    "Four things with #{subinstance.var} from #{@mynum}"
  end

  def many_things(times,subinstance)
    "#{times} things with #{subinstance.var} from #{@mynum}"
  end

  def make_a_sub(uniqueness)
    Subthing.new(uniqueness,self)
  end


  class Subthing
    def initialize(uniqueness,master)
      @u = uniqueness
      @master = master
    end

    # Here I'm forwarding method calls
    def one_thing
      master.one_thing(self)
    end

    def four_things
      master.four_things(self)
    end

    def many_things(times)
      master.many_things(times,self)
    end
  end
end

m = Master.new(42)
s = m.make_a_sub("very")

s.one_thing === m.one_thing(s)

s.many_things(8) === m.many_things(8,s)

Надеюсь, вы сможете увидеть, что здесь происходит. Я бы использовал method_missing, но я не уверен, как справиться с возможностью того, что некоторые вызовы будут иметь аргументы, а некоторые нет (я также не могу изменить порядок аргументов в методах Master)

Спасибо за чтение!

1 Ответ

6 голосов
/ 31 мая 2010

Поддержка шаблона делегирования


Делегат


Делегат помогает здесь? Позволяет делегировать методы второму классу

Эта библиотека предоставляет три различных способа делегировать вызовы методов для объекта. Самым простым в использовании является SimpleDelegator. Передайте объект в конструктор, и все методы, поддерживаемые объектом, будут делегированы. Этот объект может быть изменен позже.

Идя дальше, метод DelegateClass верхнего уровня позволяет легко настроить делегирование посредством наследования классов. Это значительно более гибко и, следовательно, возможно, является наиболее распространенным вариантом использования этой библиотеки.

Наконец, если вам нужен полный контроль над схемой делегирования, вы можете наследовать от абстрактного класса Delegator и настраивать по мере необходимости. (Если вам нужен этот элемент управления, посмотрите на forwardable, также в стандартной библиотеке. Он может лучше удовлетворить ваши потребности.)


1024 * Доступный для отправки *
Также есть пересылаемая библиотека Эта библиотека позволяет делегировать вызовы метода для объекта по методу. Вы можете использовать Forwardable для настройки этого делегирования на уровне класса или SingleForwardable для его обработки на уровне объекта.

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