オーバーライドしたメソッドの中からスーパークラスのメソッドを呼び出す
スーパークラスのメソッドがサブクラスでオーバーライドされた場合でも、サブクラスのインスタンスからスーパークラスのメソッドを「super」を指定しt明示的に呼び出すことができます。ここでは Ruby でオーバーライドされたスーパークラスのメソッドを呼び出す方法について解説します。
(Last modified: )
スーパークラスのメソッドを呼び出す
例として次のように「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 )
著者 / TATSUO IKURA
これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。