メソッドのオーバーライド
クラスの継承を利用する場合、スーパークラスで定義されたメソッドをサブクラス側で同じ名前を使ってメソッドを新しく定義しなおすことができます。このようにサブクラス側で同じ名前でメソッドを定義することをメソッドのオーバーライドと呼びます。
具体的には次にようになります。
class Car def accele print("アクセルを踏みました") end def brake print("ブレーキを踏みました") end end class Soarer < Car def openRoof print("ルーフを開けました") end def accele print("アクセルを踏み加速しました") end end
この例では「Soarer」クラスのオブジェクトを作成し「accele」メソッドを実行した場合には「Soarer」クラスで定義されたメソッドが実行されます。
また同じ「Car」クラスをスーパークラスを持つサブクラスであってもメソッドのオーバーライドを行わなかった場合は、スーパークラス側のメソッドがそのまま実行されます。
class Car def accele print("アクセルを踏みました") end def brake print("ブレーキを踏みました") end end class Soarer < Car def openRoof print("ルーフを開けました") end def accele print("アクセルを踏み加速しました") end end class Crown < Car def reclining print("シートをリクライニングしました") end end
「Crown」クラスでは「accele」メソッドがオーバーライドされていませんので、「Cronw」クラスのオブジェクトに対して「accele」メソッドを実行するとスーパークラスの「Car」クラスで定義された「accele」メソッドが実行されます。
このようにオーバーライドを使うことでスーパークラスで定義されたメソッドをサブクラス側で自由に書き換えて使用することが可能です。オーバーライドされた場合であってもスーパークラス側で定義されたメソッドを呼び出すことも可能です。スーパークラス側のメソッドを明示的に呼び出す方法は次のページで確認します。
サンプルプログラム
それでは実際に試してみましょう。
class Car def accele print("アクセルを踏みました¥n") end def brake print("ブレーキを踏みました¥n") end end class Soarer < Car def openRoof print("ルーフを開けました¥n") end def accele print("アクセルを踏んで加速しました¥n") end end class Crown < Car def reclining print("シートをリクライニングしました¥n") end end soarer = Soarer.new soarer.accele crown = Crown.new crown.accele
上記を実行すると次のように表示されます。
同じ「accele」メソッドを呼び出していますが「Soarer」クラスのオブジェクトをに対して「accele」メソッドを呼び出した時はオーバーライドして定義したメソッドが呼び出されているのが確認できます。
( Written by Tatsuo Ikura )