在Ruby中,当我通过孩子调用父母的方法时,是否有可能让孩子保持不变?
示例:
class Tester
class Parent
def go
EWOCK
end
end
class Child < Parent
EWOCK = "EWOCKS rule"
end
end
然后拨打Tester::Child.new.go
并希望“EWOCKS规则”回来?
[编辑3/31]
哇,我真的很抱歉。我完全搞砸了解释。再次,许多道歉并感谢那些回复试图理解我可怕的写作的人。
现在已修好。
答案 0 :(得分:42)
编辑:这个答案是正确的,尽管Wayne是解决这个问题的更多红宝石方法。
是的。
您的实现将不工作,因为父级尝试在本地解析EWOK。父级没有定义EWOK。但是,您可以告诉Ruby专门查看调用该方法的实际实例的类,以获取EWOK。
此将工作:
class Parent
def go
self.class::EWOK
end
end
class Child < Parent
EWOK = "Ewoks Rule"
end
class Child2 < Parent
EWOK = "Ewoks are ok, I guess"
end
bob = Child.new
bob.go # => "Ewoks Rule"
joe = Child2.new
joe.go # => "Ewoks are ok, I guess"
这里发生了什么: 在Parent的'go'中,“self”将引用实际被调用的'go'对象的实例。即,鲍勃(孩子)或乔(孩子2)。 self.class获取该实例的实际类 - 在bob的情况下为Child,在joe的情况下为Child2。 然后,self.class :: EWOK将从正确的类中检索EWOK。
答案 1 :(得分:12)
要使父类能够访问子类中定义的常量,请将该常量包装在方法中。然后适用正常的继承规则:
class Parent
def ewok
"Ewoks are lame"
end
end
class Child < Parent
def ewok
"Ewoks rule"
end
end
p Parent.new.ewok # Ewoks are lame
p Child.new.ewok # Ewoks rule
如果常量很难初始化(例如,一个大的哈希),则将其定义为常量,但通过方法访问它:
class Parent
EWOK = {
# Enormous hash...
}
def ewok
EWOK
end
end