RubyとJavaではsuperの意味が異なっている。Javaではスーパークラスをレシーバとするためのキーワードであり、Rubyでは現在のメソッドがオーバーライドしているメソッドの呼び出しになる。
class Oya { void a(){ System.out.println("oya"); } } class Ko extends Oya{ void a() { System.out.println("ko"); } void b() { a(); # ko super.a(); # oya } }
Rubyでは
class Oya def a() p "oya" end end class Ko < Oya def a() p "ko" end def b() a(); # ko super.a(); # エラー end end
Rubyでsuper.a()というコードを実行すると、親クラスのbメソッドを呼び出し、その戻り値をレシーバとしてaメソッドを呼び出す。この例では、親クラスにはbメソッドが無い為、superは失敗し、実行エラーになる。
スーパークラスのaメソッドをサブクラスのbメソッドから呼び出したい場合はaliasを使う
class Oya def a() p "oya" end end class Ko < Oya alias :super_a :a def a() p "ko" end def b() a(); # ko super_a(); # oya end end
aliasはオーバーライドしたaメソッドより先に記述しなくてはならない。後に記述するとサブクラスのaメソッドがsuper_aにエイリアスされてしまう。Rubyでは定義文のように見える記述も、実際は実行文であることに注意する。