calling another method in super class in ruby

Ruby

Ruby Problem Overview


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

Ruby Solutions


Solution 1 - Ruby

class B < A

  alias :super_a :a

  def a
    b()
  end
  def b
    super_a()
  end
end  

Solution 2 - Ruby

There's no nice way to do it, but you can do A.instance_method(:a).bind(self).call, which will work, but is ugly.

You could even define your own method in Object to act like super in java:

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

Solution 3 - Ruby

If you don't explicitly need to call A#a from B#b, but rather need to call A#a from B#a, which is effectively what you're doing by way of B#b (unless you're example isn't complete enough to demonstrate why you're calling from B#b, you can just call super from within B#a, just like is sometimes done in initialize methods. I know this is kind of obvious, I just wanted to clarify for any Ruby new-comers that you don't have to alias (specifically this is sometimes called an "around alias") in every case.

class A
  def a
    # do stuff for A
  end
end

class B < A
  def a
    # do some stuff specific to B
    super
    # or use super() if you don't want super to pass on any args that method a might have had
    # super/super() can also be called first
    # it should be noted that some design patterns call for avoiding this construct
    # as it creates a tight coupling between the classes.  If you control both
    # classes, it's not as big a deal, but if the superclass is outside your control
    # it could change, w/o you knowing.  This is pretty much composition vs inheritance
  end
end

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionIttayDView Question on Stackoverflow
Solution 1 - RubyBeffaView Answer on Stackoverflow
Solution 2 - Rubysepp2kView Answer on Stackoverflow
Solution 3 - RubykernelsmithView Answer on Stackoverflow