I just started to learn Ruby. I have a question about how to refer to the superclass's method in the subclass if there is a method in the subclass that has the same name. In class B's method3(), I want to call method1 in class A,and not the local method. Is there a way I can call the method1 in class A instead of the method 1 in class B?
CodePudding user response:
I think the answer is no, you can't do it. You are doing an overriding on the method, so you give to the parent's method a new implementation. Here you can find some examples for Ruby.
So if you want to have two methods with a complete different implementation available for both Class (Parent and Child), you should use different names.
CodePudding user response:
If you really ever need this, there are two approaches I can think of:
1. Save the original method
You can create an alias (or alias_method) before overriding method1 and then call that alias just like a regular method:
class B < A
alias orig_method1 method1
def method1
300
end
def method2
400
end
def method3
orig_method1
end
end
2. Dynamically retrieve the super method
You can call Ruby's method to get a method object for your method and then call its super_method:
class B < A
def method1
300
end
def method2
400
end
def method3
method(:method1).super_method.call
end
end
Both of the above will result in:
B.new.method3
#=> 400
This is because B#method3 calls A#method1 which in turn calls the receiver's method2. (which is B#method2 for instances of B)

