假设我有从A类派生的B类
是否有可能像这样调用A的覆盖方法?
class A
def method1
end
def method2
end
end
class B < A
def method1
### invoke method2 of class A is what I want to do here
end
def method2
end
end
Run Code Online (Sandbox Code Playgroud)
#不完全重复如何从子类调用重写的父类方法? ,但我们似乎想要做同样的事情.
sep*_*p2k 16
我在这里假设B应该从A继承而你只是在你的示例代码中输入了一个拼写错误.如果不是这样,就没有办法做你想做的事.
否则,你可以做你想做使用反射通过结合什么A的method2实例方法,以你目前的B对象,并调用它像这样:
class A
def method1
end
def method2
end
end
class B < A
def method1
A.instance_method(:method2).bind(self).call
end
def method2
end
end
Run Code Online (Sandbox Code Playgroud)
请注意,除非你真的需要,否则你不应该拔出像这样的大黑魔法枪.在大多数情况下,重新设计类层次结构以便您不需要这样做是更好的选择.
您可以使用aliasstatement 为parent方法创建一个同义词,并从overriden方法中调用它:
class A
def method1
puts '1'
end
def method2
puts '2'
end
end
class B < A
alias parent_method1 method1
alias parent_method2 method2
def method1
parent_method2
end
def method2
end
end
b = B.new
b.method1 # => 2
Run Code Online (Sandbox Code Playgroud)
@ sepp2k的答案在技术上是正确的,但是我想解释一下为什么这种技术在我看来不合适(所以这个问题在技术上很有意思,但导致错误的目标):
super.method2在method1B实例中调用上下文,因为执行它是错误的.当您的实例是超类的特化时,应该使用类继承.这包括你通常只通过调用super来扩展行为,并在该调用之前或之后另外做一些事情.因此,请尝试找出您要更改呼叫的原因,然后解决此问题.如果你method1的A在B中实现错误,那么你不应该是子类.
| 归档时间: |
|
| 查看次数: |
6918 次 |
| 最近记录: |