2012-01-18 16 views
3

すべてのインスタンスとクラスのメソッドを別のクラスに委譲するクラスを作りたいと思います。私の目的は、appオプションで設定されたクラスに、その周りのコードに適合する名前を付けることができるようにすることです。クラスメソッドをどのように委譲しますか?

これは私がこれまで持っているものです。

require 'delegate' 

class Page < DelegateClass(PageAdapter) 
    # Empty 
end 

しかし、これが唯一のインスタンスメソッドではなく、クラスメソッドを委任するようです。

+3

私はあなたがすべきだと思いますサブクラス 'PageAdapter' – ShiningRay

+0

ShiningRay - あなたが正しいと思います。私はちょっと愚かな自分自身を考えていない:)あなたが答えとして追加する場合はそれを選択します –

答えて

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" 
+0

これは質問ではなかった:) – metakungfu

+1

@metakungfuコメントに注意してください:ShiningRayはサブクラス化を提案し、正しい答え。私はShiningRayが決して戻って答えに答えを変換しなかったので、この答えを加えました。 – Phrogz

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 
関連する問題