你如何委托类方法?

时间:2012-01-18 14:55:12

标签: ruby delegation

我想创建一个将所有实例和类方法委托给另一个类的类。我的目标是能够在应用程序选项中设置一个名称,该名称似乎与其周围的代码相符。

这是我到目前为止所做的:

require 'delegate'

class Page < DelegateClass(PageAdapter)
  # Empty
end

但是,这似乎只是委托实例方法,而不是类方法。

2 个答案:

答案 0 :(得分:2)

您可以定义自己的委派方案:

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

答案 1 :(得分:0)

你不想要委托,你想要直接子类化:

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"