メソッドのオーバーライド
クラスの継承を利用する場合、スーパークラスで定義されたメソッドをサブクラス側で同じ名前を使ってメソッドを新しく定義しなおすことができます。このようにサブクラス側で同じ名前でメソッドを定義することをメソッドのオーバーライドと呼びます。
具体的には次にようになります。
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 )
RubyLife