在ruby中调用超类中的另一个方法

Itt*_*ayD 47 ruby

class A
  def a
    puts 'in #a'
  end
end

class B < A
  def a
    b()
  end
  def b
    # here i want to call A#a.
  end
end  

Bef*_*ffa 80

class B < A

  alias :super_a :a

  def a
    b()
  end
  def b
    super_a()
  end
end  
Run Code Online (Sandbox Code Playgroud)

  • 为什么这样做?为什么这不会将`:super_a`别名为`Ba`而是将它别名为`Aa`? (2认同)
  • @MarkoAvlijaš在你创建别名的时候,`Ba`还没有被定义......如果你把'alias`放在`def a`下面就不是这样了 (2认同)

sep*_*p2k 30

没有很好的方法可以做到,但你可以这样做A.instance_method(:a).bind(self).call,这将有效,但是很难看.

您甚至可以在Object中定义自己的方法,以便像java中的super一样:

class SuperProxy
  def initialize(obj)
    @obj = obj
  end

  def method_missing(meth, *args, &blk)
    @obj.class.superclass.instance_method(meth).bind(@obj).call(*args, &blk)
  end
end

class Object
  private
  def sup
    SuperProxy.new(self)
  end
end

class A
  def a
    puts "In A#a"
  end
end

class B<A
  def a
  end

  def b
    sup.a
  end
end
B.new.b # Prints in A#a
Run Code Online (Sandbox Code Playgroud)

  • @klochner我不同意,这个解决方案正是我所需要的...理由:我想一般性地调用不同方法的超级方法,但是不需要为我希望能够为此做的每一个别名,所以调用super的通用方法非常有用 (8认同)
  • 复杂定义一次,简单多次调用它.这比反之亦然. (3认同)