0

私が持っている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 classMyBase.static_method1でオーバーライドしたいMyChild2

4

1 に答える 1

2

問題は、method3 が常に基底クラスのメソッドを明示的に呼び出していることです。これを次のように変更します。

def method3
  self.class.static_method1
end

その後、使用しないことを検討して@@ください。

@@ruby では非常に直感に反しており、自分が思っていることを意味することはめったにありません。

問題は、継承されたすべてのクラスと基本クラスで@@共有されることです。説明については、このブログ投稿を参照してください

于 2013-01-15T05:02:46.910 に答える