Как вы делегируете методы класса? - PullRequest
3 голосов
/ 18 января 2012

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

Это то, что я имею до сих пор:

require 'delegate'

class Page < DelegateClass(PageAdapter)
  # Empty
end

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

Ответы [ 2 ]

2 голосов
/ 18 января 2012

Вы можете определить свою собственную схему делегирования:

class Page < DelegateClass(PageAdapter)
  @@delegate_class=PageAdaptor
  def self.delegate_class_method(*names)
    names.each do |name| 
      define_method(name) do |*args|
        @@delegate_class.__send__(name, *args)
      end
    end
  end
  delegate_class_method @@delegate_class.singleton_methods
end
0 голосов
/ 18 января 2012

Вы не хотите делегировать, вы хотите прямой подкласс:

class Page < PageAdapter
  # Empty
end

Доказательство:

class Foo
  def self.cats?
    "YES"
  end
  def armadillos?
    "MAYBE"
  end
end

class Bar < Foo; end

p Bar.new.armadillos?
#=> "MAYBE"

p Bar.cats?
#=> "YES"
...