【发布时间】:2013-10-15 13:34:09
【问题描述】:
假设我有一个包含一些“静态”变量的类。我希望该类的子类能够覆盖这些变量而不影响原始类。使用类变量是不可能的,因为这些变量似乎在子类和超类之间共享:
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
超类中定义的方法忽略子类中的常量。
显而易见的解决方法是为需要“覆盖”的变量定义方法:
class Foo
def test; "a"; end
end
但这感觉就像一个黑客。我觉得使用类变量应该可以做到这一点,而且我可能只是做错了。例如,当我将Object 子类化时(默认情况下会发生这种情况):
class Foo < Object
@@bar = 123
end
Object.class_variable_get(:@@bar)
# NameError: uninitialized class variable @@bar in Object
为什么@@bar 不像上面的Bar < Foo 示例中那样设置在Object 上?
总结一下:如何在不影响超类的情况下覆盖子类中的变量?
【问题讨论】:
标签: ruby