2012-04-17 543 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