2012-04-17 159 views
3

我在Ruby中有一個基類,它有一個它繼承的類方法。我想調用基類的這個方法,但它傳遞這是由派生類中指定的選項,如下所示:基類中的Ruby訪問派生類「類方法」

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自身來調用派生方法。

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

您也可以調用__send__而不是發送。 – 2012-04-17 12:39:06

+0

我應該提到:SuperDuperClass來自一個庫,所以最好是如果我不必猴子修補它來實現這個功能。當我在基類中使用'self.send'而不是直接調用方法時,我得到一個NoMethodError – alexsanford1 2012-04-17 13:39:22

+0

這不是猴子修補。發送和調用方法一樣。我的壞處是,因爲你正在調用一個類方法,所以你需要發送這個類。我會編輯我的答案。 – 2012-04-17 17:35:39