オーバーライドしたメソッドの中からスーパークラスのメソッドを呼び出す

スーパークラスのメソッドがサブクラスでオーバーライドされた場合でも、サブクラスのインスタンスからスーパークラスのメソッドを「super」を指定しt明示的に呼び出すことができます。ここでは Ruby でオーバーライドされたスーパークラスのメソッドを呼び出す方法について解説します。

(2021 年 06 月 30 日公開 / 2022 年 10 月 21 日更新)

スーパークラスのメソッドを呼び出す

例として次のように「Car」クラスを継承した「SportsCar」クラスを作成し、「Car」クラスで定義されているメソッドをサブクラスの方でオーバーライドしてみます。

class Car
  def accele
    puts("アクセルを踏みました")
  end
end

class SuperCar < Car
  def accele
    puts("加速しました")
  end
end

「SportsCar」クラスのインスタンスを作成し「accele」メソッドを呼び出すと、オーバーライドしたメソッドの方を呼び出すため「加速しました」と表示されます。

このようにオーバーライドされたメソッドがあった場合、スーパークラスのではなくサブクラスのメソッドの方が呼び出されますが、オーバーライドされたメソッドの中で super と記述すると、スーパークラスの同じ名前のメソッドを呼び出すことができます。

class Car
  def accele
    puts("アクセルを踏みました")
  end
end

class SuperCar < Car
  def accele
    super
    puts("加速しました")
  end
end

「SportsCar」クラスのインスタンスを作成し「accele」メソッドを呼び出すと、オーバーライドしたメソッドの方が呼び出されますが、そのメソッドの中で super を呼び出しているためまず「アクセルを踏み込みました」表示されます。そしてそのあとで「加速しました」と表示されます。

このようにオーバーライドしたメソッドの中からスーパークラスの同じ名前のメソッドを呼び出すことができます。

サンプルコード

それでは実際に試してみましょう。

# encoding: UTF-8

class Car
  def accele
    puts("アクセルを踏みました")
  end

  def brake
    puts("ブレーキを踏みました")
  end
end

class SportsCar < Car
  def accele
    super
    puts("加速しました")
  end
end

sc = SportsCar.new
sc.accele

上記を実行すると次のように表示されます。

スーパークラスのメソッドを実行する

このようにスーパークラスのメソッドの内容を完全に書き換えるのではなく、スーパークラスのメソッドを利用しつつサブクラス側で追加の機能を記述する形でメソッドをオーバーライドすることが可能です。

-- --

Ruby でオーバーライドされたスーパークラスのメソッドを呼び出す方法について解説しました。

( Written by Tatsuo Ikura )

広告
Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。