Ruby:在子类中调用父类的重写方法

Jok*_*ter 11 ruby

假设我有从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继承而你只是在你的示例代码中输入了一个拼写错误.如果不是这样,就没有办法做你想做的事.

否则,你可以做你想做使用反射通过结合什么Amethod2实例方法,以你目前的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)

请注意,除非你真的需要,否则你不应该拔出像这样的大黑魔法枪.在大多数情况下,重新设计类层次结构以便您不需要这样做是更好的选择.


Ali*_*kau 9

您可以使用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)


mli*_*elt 5

@ sepp2k的答案在技术上是正确的,但是我想解释一下为什么这种技术在我看来不合适(所以这个问题在技术上很有意思,但导致错误的目标):

  • Ruby不允许super.method2method1B实例中调用上下文,因为执行它是错误的.当您的实例是超类的特化时,应该使用类继承.这包括你通常只通过调用super来扩展行为,并在该调用之前或之后另外做一些事情.
  • 有一些语言,如Java和其他语言,允许调用super用于另一种方法,这导致类似于意大利面条代码,但是面向对象的方式.没有人知道何时调用哪些方法,所以尽量避免使用它.

因此,请尝试找出您要更改呼叫的原因,然后解决此问题.如果你method1的A在B中实现错误,那么你不应该是子类.