メソッドのオーバーライド

広告

クラスの継承を利用する場合、スーパークラスで定義されたメソッドをサブクラス側で同じ名前を使ってメソッドを新しく定義しなおすことができます。このようにサブクラス側で同じ名前でメソッドを定義することをメソッドのオーバーライドと呼びます。

具体的には次にようになります。

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」メソッドが実行されます。

このようにオーバーライドを使うことでスーパークラスで定義されたメソッドをサブクラス側で自由に書き換えて使用することが可能です。オーバーライドされた場合であってもスーパークラス側で定義されたメソッドを呼び出すことも可能です。スーパークラス側のメソッドを明示的に呼び出す方法は次のページで確認します。

サンプルプログラム

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

InheritTest2.rb

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 )

関連記事 (一部広告含む)