Ruby

【Ruby】メソッドのオーバーライドで用いるsuper(スーパー)クラスとは?

Ruby

 

今回はメソッドのオーバーライド(上書き)に用いられる、super(スーパー)クラスについて解説したいと思います。Railsでは、Deviseを継承したコントローラーを作成する際に登場するメソッドになります。

メソッドのオーバーライドとは

メソッドのオーバーライドとは、継承元のクラスと継承先のクラスで同じメソッド名を指定することを言います。これにより、継承先のクラスで定義したメソッドが呼び出されるようになります。

言葉だと説明が難しいので、例を用いながら解説していきます。以下のように、Fruitsクラスを定義しました。

class Fruits
  def red
    puts "りんご"
  end
end

 

redメソッドを呼び出すと、当然「りんご」が表示されますよね。

class Fruits
  def red
    puts "りんご"
  end
end

fruits = Fruits.new
fruits.red
> りんご

 

では、Fruitsクラスを継承したVegetablesクラスをさらに定義したとします。加えて、Vegetablesクラスの中にはredメソッドも同様に定義しています。

class Fruits
  def red
    puts "りんご"
  end
end

class Vegetables < Fruits
  def red
    puts "トマト"
  end
end

 

この状態でredメソッドを呼び出すとどうなるでしょうか?

答えは「トマト」が出力されます。このように、継承元のクラスと継承先のクラスで同じメソッド名を指定していると、継承先のメソッドが呼び出されます。これがメソッドのオーバーライドです。

class Fruits
  def red
    puts "りんご"
  end
end

class Vegetables < Fruits
  def red
    puts "トマト"
  end
end

vegetables = Vegetables.new
vegetables.red
> トマト

superクラスとは

では本題のsuperクラスに移ります。

superクラスとは、オーバーライドされる前のメソッドを呼び出すことができるメソッドです。言い換えれば、継承元のメソッドを出力することが可能です。superと記述することで、これらの操作が可能になります。

こちらも説明が難しいので、例を用いながら解説していきます。先程と同様にFruitsクラスと、Fruitsクラスを継承したVegetablesクラスを定義しました。

class Fruits
  def red
    puts "りんご"
  end
end

class Vegetables < Fruits
  def red
    puts "トマト"
  end
end

 

redメソッドを呼び出すと「トマト」が出力されることは、前回の項目で確認できました。では、superクラスを用いると、どのような結果に変わるのでしょうか。

以下のようにsuperを定義しましょう。

class Fruits
  def red
    puts "りんご"
  end
end

class Vegetables < Fruits
  def red
    super
    puts "トマト"
  end
end

 

次に、redメソッドを2回呼び出してみます。すると、以下のように「りんご」→「トマト」と表示されると思います。オーバーライドされる前のメソッドを呼び出すことが、superと記述することで可能になります。

class Fruits
  def red
    puts "りんご"
  end
end

class Vegetables < Fruits
  def red
    super
    puts "トマト"
  end
end

vegetables = Vegetables.new
vegetables.red
> りんご

vegetables = Vegetables.new
vegetables.red
> トマト

 

このようにsuperを記述することで、継承元の機能は失われずに追加の機能を実装することが可能になるため、deviseを用いたコントローラー実装などで用いられます。

まとめ

  • メソッドのオーバーライドとは、継承元のクラスと継承先のクラスで同じメソッド名を指定すること
  • superクラスとは、オーバーライドされる前のメソッドを呼び出すことができるメソッドである
  • superを記述することで、継承元の機能は失われずに追加の機能を実装することが可能である

参考

Rubyリファレンス:
https://docs.ruby-lang.org/ja/2.5.0/doc/spec=2fcall.html#super

 

 

今回はメソッドのオーバーライド(上書き)に用いられる、super(スーパー)クラスについて解説しました。やや難しい概念ですが、この機会にマスターしておきましょう。