假设您有以下Ruby类:
class A
def self.greet
puts 'hi'
end
end
class B < A; end;
class C < B; end;
是否可以在greet
上重新定义B
,C
仍然使用原始定义而不修改C
?
(我明白“你做错了”是一个可能的反应,但请假设有一个很好的理由这样做。)
很高兴再次看到Ruby会让你做任何你想做的事情。但是,对于任何发现这个问题并想到这样做的人,我应该说我最终意识到我做错了; C需要直接子类化A.
继续阅读以接收霰弹枪,并观察瞄准目标的位置。 :)
答案 0 :(得分:5)
您可以执行以下操作:
def B.greet
puts self == B ? 'beeeee' : super
end
这意味着B知道您要更改其greet
的版本,但仅适用于B
而不是其他任何死亡类。
答案 1 :(得分:2)
当班级为“B”时,做你的事,否则叫super:
class B
def self.greet
if self == B
puts "my new self"
else
super
end
end
end
如果继承不断推动你添加这样的棘手事情,你可能会玩模块。这是一个有趣的阅读on Ruby inheritance vs. modules