委托给基类实现

问题描述:

如何将基类中的调用委托给基类实现而不是继承的类实现?例如:委托给基类实现

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 

在上面的例子中,什么是打印hellofoo方法由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