【问题标题】:Ruby access derived class "class methods" from base classRuby 从基类访问派生类“类方法”
【发布时间】:2012-04-28 18:09:45
【问题描述】:

我在 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,而只需指定选项即可。

有什么想法吗?

【问题讨论】:

    标签: ruby oop inheritance derived-class base-class


    【解决方案1】:

    当你说它不起作用时,你并没有具体说明。我相信在定义 Base 类时(而不是在调用 my_option_value 时)会引发异常。

    建议你把方法名作为符号传递,在SuperDuperClass中调用send on self调用派生方法。

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

    【讨论】:

    • 你也可以调用send来代替send。
    • 我应该提到:SuperDuperClass 来自一个库,所以如果我不必对其进行猴子补丁来使其工作,那将是最好的。当我在基类中使用self.send 而不是直接调用方法时,我得到一个 NoMethodError
    • 这不是猴子补丁。 Send 与调用方法的作用相同。我不好的是,由于您正在调用类方法,因此您需要发送类。我将编辑我的答案。
    【解决方案2】:

    为了关闭它,我的解决方案是在子类中调用super_duper_class_method。这是我试图避免的,但在这种情况下,如果没有一些非常疯狂的元编程,我认为不可能得到我想要的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-03
      • 1970-01-01
      • 1970-01-01
      • 2014-06-22
      • 1970-01-01
      • 2015-05-23
      • 1970-01-01
      • 2020-02-11
      相关资源
      最近更新 更多