如何在继承类中使用覆盖常量

时间:2010-07-04 12:02:47

标签: ruby class inheritance constants

给出这段代码:

class A
  CONST = 'A'

  def initialize
    puts CONST
  end
end

class B < A
  CONST = 'B'
end

A.new # => 'A'
B.new # => 'A'

我希望B使用CONST = 'B'定义,但我不知道如何。有什么想法吗?

问候

汤姆

4 个答案:

答案 0 :(得分:73)

class A
  CONST = 'A'

  def initialize
    puts self.class::CONST
  end
end

class B < A
  CONST = 'B'
end

A.new # => 'A'
B.new # => 'B'

答案 1 :(得分:2)

我对Konstantin Haase的解决方案有一些问题。在继承类的实例化对象中访问常量时,使用了父常量。

我必须明确地引用该课程。

self.class::CONST

欢呼声

答案 2 :(得分:2)

很抱歉,我无法将代码格式设置为仅在“回答”中的“评论”中工作,但这是对akostadinov向Hendrik提出的问题的回应“这与他的[康斯坦丁]答案有何不同?”

我猜Hendrik试图从他的继承类&amp;中的方法中访问常量。这取决于它是实例还是静态方法。它看起来像你在实例方法中所期望的那样。但也许或许不是你对静态方法的期望。即使这不是亨德里克的意思,这也许值得注意:

如果你有确切的类定义为Konstantin,但你像这样在A类中添加一个方法:

def self.print_const
  puts CONST
end

然后你得到A两次:

A.print_const # prints A
B.print_const # prints A

但是,如果您通过引用类来定义A中的方法:

def self.print_const
  puts self::CONST
end

然后你得到:

A.print_const # prints A
B.print_const # prints B

答案 3 :(得分:1)

如果有人发现这个并且正在使用模块扩展名,请使用

self::CONST