2012-04-17 20 views
3

Rubyに継承したクラスメソッドを持つ基本クラスがあります。私は、基本クラスでこのメソッドを呼び出しますが、派生クラスで指定されたオプションを渡し、そのようにしたいと思います:Rubyアクセス派生クラス "class methods"(基底クラス)

class Base < SuperDuperClass 
    super_duper_class_method :option => my_option_value 

    def self.my_option_value 
    raise "Method my_option_value must be overridden by all subclasses" 
    end 
end 

class Derived < Base 
    def self.my_option_value 
    "My Derived Option Value" 
    end 
end 

はしかし、これは動作しません。基本クラスのトップレベルコードが派生クラスのトップレベルコードの前に実行されるため、super_duper_class_methodが呼び出されたときに派生メソッドが定義されていないためです。私は、すべての派生クラスでsuper_duper_class_methodを呼び出す必要はなく、オプションを指定するだけです。

アイデア?

答えて

0

ただ、これを閉鎖するために、私の解決策は、サブクラスでsuper_duper_class_methodを呼び出すことです。これは私が避けようとしていたものですが、この状況では、かなり野生的なメタプログラミングがなければ、私が進めていることを得ることはできないと思います。

0

あなたはそれが機能していないと言ったときにあなたは特定ではありませんでした。 Baseクラスが定義されているとき(my_option_valueが呼​​び出されるときではなく)に例外が発生すると思います。

メソッド名をシンボルとして渡すことをお勧めします。SuperDuperClassでは、send on selfを呼び出して派生したメソッドを呼び出します。

class SuperDuperMethod 
    def self.some_code 
    self.class.__send__(options[:option]) 
    end 
... 
+0

sendの代わりに__send__を呼び出すこともできます。 –

+0

私は言及すべきである:SuperDuperClassはライブラリからのものなので、これを動作させるためにサルパッチをする必要がないなら、最高のものになるだろう。メソッドを直接呼び出すのではなく、 'self.send'を基本クラスで使用すると、NoMethodErrorを取得します。 – alexsanford1

+0

サルのパッチ適用ではありません。 Sendメソッドを呼び出すのと同じことを行います。私の悪い点は、あなたがクラスメソッドを呼び出すので、クラスを送信する必要があるということでした。私は私の答えを編集します。 –

関連する問題