委托给基类实现
问题描述:
如何将基类中的调用委托给基类实现而不是继承的类实现?例如:委托给基类实现
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
方法的基类中调用最优雅的方式?
答
基于我对ruby方法查找算法的理解,我不认为有可能实现你正在尝试做的事情,而不使用不同的方法名称,或者也没有在子类中删除bar方法。
问题在于,当由类A中的bar方法调用时接收foo消息的“self”将始终是类B的实例(当从类B的实例中调用时)。由于B类自己的foo方法总是首先被ruby的方法查找算法找到,所以没有办法调用类A的原始foo方法(类B完全覆盖了类A的继承foo方法)。
一个不那么完美的解决方案是使用“周围的别名”,如下所示,但它确实需要过度踏杆方法还:
class B < A
alias :old_foo :foo
def foo
p "world"
end
def bar
old_foo
end
end