假设我有一个带有一些“静态”变量的类。我希望该类的子类能够覆盖这些变量而不影响原始类。使用类变量是不可能的,因为这些变量似乎在子类和超类之间共享:
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
set on Object
就像在我的Bar < Foo
上面的例子?
总结一下:如何在不影响超类的情况下重写子类中的变量?
类常量可以做你想要的,你只需要以不同的方式使用它们:
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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)