【问题标题】:How to use an overridden constant in an inheritanced class如何在继承类中使用覆盖常量
【发布时间】:2011-03-11 14:44:39
【问题描述】:

鉴于此代码:

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' 定义,但我不知道如何使用。有什么想法吗?

问候

汤姆

【问题讨论】:

    标签: ruby class inheritance constants


    【解决方案1】:
    class A
      CONST = 'A'
    
      def initialize
        puts self.class::CONST
      end
    end
    
    class B < A
      CONST = 'B'
    end
    
    A.new # => 'A'
    B.new # => 'B'
    

    【讨论】:

    • 所以...这意味着如果不更改使用 CONST 的 A 类中的所有位置,就没有办法做到这一点?
    • 是的。常量查找通常在编译时绑定。
    【解决方案2】:

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

    我必须明确引用该类。

    self.class::CONST
    

    干杯

    【讨论】:

    • 这和他的回答有什么不同?
    【解决方案3】:

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

    我猜 Hendrik 试图从他的继承类中的方法访问常量,这取决于它是实例方法还是静态方法。它的行为似乎与您在实例方法中所期望的一样。但也许或也许不是你对静态方法的期望。即使这不是 Hendrik 的意思,这也可能值得注意:

    如果您有与 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
    

    【讨论】:

      【解决方案4】:

      如果有人发现这个并使用模块扩展代替,只需使用

      self::CONST

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-30
        • 2022-01-12
        • 2013-12-04
        • 2011-05-23
        • 2012-11-20
        相关资源
        最近更新 更多