Ruby で明示的に名前を指定して親クラスのメソッドを呼ぶ
自身の親メソッドを呼ぶ
自身と同じ名前の親メソッドを呼ぶ場合は super
が利用できます。
def value "Super#value" end end class Sub < Super def value # Super#value を呼ぶ super end end p Sub.new.value # => "Super#value"
では、異なるメソッドから任意の親メソッドを呼ぶ場合はどうするのでしょうか。
class Super def value "Super#value" end end class Sub < Super def value "Sub#value" end def value2 # ここで Super#value を呼び出したい end end
答え: Method#super_method
を使う
こういう場合は Method#super_method
が利用できます。
次のようにして任意のメソッドオブジェクトを取得し、 #super_method
で親のメソッドオブジェクトを取得します。
class Super def value "Super#value" end end class Sub < Super def value "Sub#value" end def value2 # value のメソッドオブジェクトを取得し、その親メソッドを参照する method(:value).super_method.call end end p Sub.new.value2 # => "Super#value"
おまけ
以下のように .instance_method
を利用して任意のクラスのメソッドを呼び出すこともできます。
class Super def value "Super#value" end end class Sub < Super def value "Sub#value" end def value2 Super.instance_method(:value).bind(self).call end end p Sub.new.value2 # => "Super#value"