无法覆盖派生类中的基类方法

时间:2013-01-15 04:55:22

标签: ruby

以下是我的Ruby课程:

class MyBase
  class << self
     def static_method1
        @@method1_var ||= "I'm a  base static method1"
     end

     def static_method1=(value)
        @@method1_var = value
     end

     def static_method2
        @@method2_var ||= "I'm a base static method2"
     end

     def static_method2=(value)
        @@method2_var = value
     end
  end

  def method3
    MyBase::static_method1
  end
end

class MyChild1 < MyBase
end

class MyChild2 < MyBase
  class << self
     def static_method1
        @@method1_var ||= "I'm a child static method1"
     end
  end
end

c1 = MyChild1.new
puts c1.method3 #"I'm a  base static method1" - correct


c2 = MyChild2.new
puts c2.method3  # "I'm a  base static method1" - incorrect. I want to get "I'm a child static method1"

我知道attr_accessor和模块,但我不能在这里使用它们,因为我希望它们在MyBase class中给出默认值。我想覆盖MyBase.static_method1中的MyChild2

1 个答案:

答案 0 :(得分:2)

问题是method3总是在基类上显式调用方法。将其更改为:

def method3
  self.class.static_method1
end

之后,请考虑不使用@@

ruby中的

@@非常违反直觉,很少意味着你的意思。

@@的问题在于,它是在继承的类和基类的所有之间共享的。 See this blog post for an explanation