如何从Ruby中的特定祖先类调用方法?

时间:2016-10-11 20:13:14

标签: ruby oop inheritance

说,我有这样的层次结构:

class A
  def some_method
    'From A'
  end
end

class B < A
  def some_method
    'From B'
  end
end

class C < B
  def some_method
    # what's here to receive 'From A' ?
  end
end

c = C.new
c.some_method # get 'From A'

如果我在C#some_method中拨打super,我会收到'从B'。 我应该如何实现C#some_method以在'From A'中获取c.some_method。 这样做的最佳做法是什么?

1 个答案:

答案 0 :(得分:4)

您可以使用“未绑定方法”:

class A
  def some_method
    'From A'
  end
end

class B < A
  def some_method
    'From B'
  end
end

class C < B
  def some_method
    A.instance_method(:some_method).bind(self).call
  end
end

c = C.new
c.some_method # get 'From A'

Ruby具有从对象解除绑定方法然后将其绑定到另一个对象的能力。 instance_method用于从类中获取方法对象,而不是从此类的特定实例中获取。稍后,我们可以将该方法绑定到调用C的{​​{1}}实例,即some_method,最后在同一行中立即调用该方法。

正如另一位用户所说,如果您这样做,您应该检查您的程序的设计,以使用合成或其他方法。