In Ruby, is there a way to 'override' a constant in a subclass so that inherited methods use the new constant instead of the old?

后端 未结 3 660
我寻月下人不归
我寻月下人不归 2020-12-10 00:29

In Ruby, is there a way to \'override\' a constant in a subclass in such a way that calling an inherited method from the subclass results in that method using the new consta

相关标签:
3条回答
  • 2020-12-10 01:00

    You can refer to a constant like this in the parent class:

    For a instance method: self.class::CONST

    For a self method: self::CONST

    class SuperClass
      CONST = "Hello, world!"
      def print_const
        puts self.class::CONST
      end
    
      def self.print_const
        puts self::CONST
      end
    
    end
    
    class SubClass < SuperClass
      CONST = "Hello, Bob!"
    end
    
    SubClass.new.print_const #=> "Hello, Bob!"
    SubClass.print_const #=> "Hello, Bob!"
    
    0 讨论(0)
  • 2020-12-10 01:04

    If you have the luxury of being able to change the base class, consider wrapping the "constants" that need changing in class methods in the base class and overriding them as needed in subclasses. This removes the potential for confusion between parent and subclass constants. For the example, this would be as follows:

    class SuperClass
      CONST = "Hello, world!".freeze
    
      def self.const
        CONST
      end
    
      def self.say_hello
        const
      end
    end
    
    class SubClass < SuperClass
      CONST = "Hello, Bob!".freeze
    
      def self.const
        CONST
      end
    end
    
    SubClass.say_hello #=> "Hello, Bob!
    
    0 讨论(0)
  • 2020-12-10 01:06

    I've done this by simply redefining the constant in the subclass, and then referring to it in methods as self.class::CONST in instance methods and self::CONST in class methods. In your example:

    class SuperClass
      CONST = "Hello, world!"
      def self.say_hello
        self::CONST
      end
    end
    
    class SubClass < SuperClass
      CONST = "Hello, Bob!"
    end
    
    SubClass.say_hello #=> "Hello, Bob!"
    
    0 讨论(0)
提交回复
热议问题