2010-10-25 153 views
0

如何將基類中的調用委託給基類實現而不是繼承的類實現?例如:委託給基類實現

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方法的基類中調用最優雅的方式?

回答

0

基於我對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