RubyとJavaのsuperの違い

RubyJavaでは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では定義文のように見える記述も、実際は実行文であることに注意する。