假设我有一个包含一些“静态”变量的类。我希望该类的子类能够在不影响原始类的情况下覆盖这些变量。使用类变量是不可能的,因为它们似乎在子类和父类(super class)之间共享:
class Foo
@@test = "a"
def speak; puts @@test; end
end
class Bar < Foo
@@test = "b"
end
Bar.new.speak
# b
Foo.new.speak
# b
也不可能使用常量:
class Foo
TEST = "a"
def speak; puts TEST; end
end
class Bar < Foo
TEST = "b"
end
Bar.new.speak
# a
Foo.new.speak
# a
父类(super class)中定义的方法会忽略子类中的常量。
明显的解决方法是为需要“可覆盖”的变量定义方法:
class Foo
def test; "a"; end
end
但这感觉就像一个 hack。我觉得这应该可以使用类变量,而且我可能只是做错了。例如,当我将 Object
子类化时(默认情况下会发生这种情况):
class Foo < Object
@@bar = 123
end
Object.class_variable_get(:@@bar)
# NameError: uninitialized class variable @@bar in Object
为什么不是 @@bar
设置在 Object
就像在我的Bar < Foo
上面的例子?
总结一下:如何在不影响父类(super class)的情况下覆盖子类中的变量?
最佳答案
类常量做你想做的,你只需要以不同的方式使用它们:
class Foo
TEST = "a"
def speak
puts self.class::TEST
end
end
class Bar < Foo
TEST = "b"
end
Bar.new.speak # => a
Foo.new.speak # => b
关于ruby - 如何在不影响父类(super class)的情况下覆盖 Ruby 子类中的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19382626/