メソッドをオーバーライドする
クラスを継承した新しいクラスを定義するときに、スーパークラスで定義されたメソッドをサブクラス側で同じ名前を使ってメソッドを新しく定義しなおすことができます。このようにサブクラス側で同じ名前でメソッドを定義することをメソッドのオーバーライドと呼びます。ここでは Ruby でメソッドをオーバーライドする方法について解説します。
(Last modified: )
メソッドをオーバーライドする
例えば「Car」クラスを継承して「SportsCar」クラスを定義した場合で考えてみます。
class Car def accele puts("アクセルを踏みました") end def brake puts("ブレーキを踏みました") end end class SportsCar < Car def openRoof puts("ルーフを開けました") end end
サブクラスの「SportsCar」クラスのインスタンスを作成した場合、スーパークラスで定義されている「accele」メソッドや「brake」メソッドを呼び出すことができます。
このようにクラスを継承したクラスを定義した場合、サブクラスの中でスーパークラスで定義されているのと同じメソッドを定義することができます。今回は「accele」クラスを定義してみます。
class Car def accele puts("アクセルを踏みました") end def brake puts("ブレーキを踏みました") end end class SportsCar < Car def openRoof puts("ルーフを開けました") end def accele puts("加速しました") end end
このようにサブクラスの中でスーパークラスで定義されているメソッドと同じ名前のメソッドを定義することを、メソッドのオーバーライドと呼びます。サブクラスのインスタンスを作成し、インスタンスからメソッドを呼び出したとき、スーパークラスとサブクラスで同じメソッド名のメソッドがあった場合には、サブクラス側で定義されたメソッドが呼び出されます。
オーバーライドの機能を使うことで、クラスを継承したクラスを作成した場合に、スーパークラスで定義されているメソッドの動作をサブクラスの方で変更したい場合には、オーバーライドしてメソッドを再定義することができます。
なおサブクラスでオーバーライドされた場合であってもスーパークラス側で定義されたメソッドを呼び出すことも可能です。スーパークラス側のメソッドを明示的に呼び出す方法は次のページで解説します。
それでは実際に試してみましょう。
# encoding: UTF-8 class Car def accele puts("アクセルを踏みました") end def brake puts("ブレーキを踏みました") end end class SportsCar < Car def accele puts("加速しました") end def openRoof puts("ルーフを開けました") end end class FamilyCar < Car def reclining puts("シートをリクライニングしました") end end sc = SportsCar.new sc.accele puts() fc = FamilyCar.new fc.accele
上記を実行すると次のように表示されます。
どちらのインスタンスもスーパークラスで定義されている「accele」メソッドを呼び出していますが、「SportsCar」クラスで「accele」クラスはオーバーライドされているので「SportsCar」クラスのインスタンスから「accele」メソッドを呼び出したときはオーバーライドしたメソッドの方が呼び出されています。
-- --
Ruby でメソッドをオーバーライドする方法について解説しました。
( Written by Tatsuo Ikura )
著者 / TATSUO IKURA
これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。