如何将基类中的调用委托给基类实现而不是继承的类实现?例如:
class A
def foo
p "hello"
end
def bar
foo
end
end
class B < A
def foo
p "world"
end
end
A.new.bar
# prints "hello"
B.new.foo
# prints "world"
B.new.bar
# prints "world"
# the function should print "hello" instead
在上面的示例中,当hello
方法在基类中调用foo
方法时,打印bar
的最优雅方式是什么?
答案 0 :(得分:0)
基于我对ruby方法查找算法的理解,我不相信如果不使用不同的方法名称或者也没有超出子类中的bar方法,就可以实现你想要做的事情。
问题是,当A类中的bar方法调用时,接收foo消息的“self”将始终是B类的实例(当从B类实例调用时)。由于B类自己的foo方法总是首先通过ruby的方法查找算法找到,所以没有办法调用类A的原始foo方法(类B毕竟是从A类重写了继承的foo方法)。
一个不那么优雅的解决方案是使用“围绕别名”,如下所示,但它确实需要超越bar方法:
class B < A
alias :old_foo :foo
def foo
p "world"
end
def bar
old_foo
end
end