superを使わずにスーパークラスのメソッドを呼び出す
サブクラスから自身がオーバーライドしたスーパークラスのメソッドを呼びたいときを読んで、私もやってみました。
class Mother def hello puts "Mother#hello" end end class Rubyco < Mother alias :xxx_hello :hello def hello puts "Rubyco#hello" end def mother_hello xxx_hello end end Rubyco.new.hello #=> Rubyco#hello Rubyco.new.mother_hello #=> Mother#hello
ほんとだ。superはスーパークラスの同名のメソッドのaliasなんだそうです。ふうん。
superを使うと、スーパークラスの同名のメソッドを呼び出してしまうので、Rubyco#mother_helloからMother#helloをsuperで呼び出すことはできません。
上のプログラムでは、Rubycoでhelloをdefする前にaliasを使ってxxx_helloという別名を定義しておき、mother_helloからxxx_helloを呼び出すことでMother#helloを呼び出しています。
追記:
aliasじゃないと思ったが。たぶん、別名であってRubyのaliasじゃないと思う。というコメントをいただきました。『オブジェクト指向スクリプト言語Ruby』のsuperを調べてみましたが、確かに別名ともaliasとも書いていませんでしたね。あとで(エイリアスと表現していた)sumimさんに確認しましょう。
追記:
sumimさんからコメントいただきました。aliasではないとのことで、上の文章も変更しました。ありがとうございます。
追記:
さらにいろいろ修正。