委托基类实现

时间:2010-10-25 10:23:28

标签: ruby

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

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的最优雅方式是什么?

1 个答案:

答案 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