说,我有这样的层次结构:
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
。
这样做的最佳做法是什么?
答案 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
,最后在同一行中立即调用该方法。
正如另一位用户所说,如果您这样做,您应该检查您的程序的设计,以使用合成或其他方法。