メソッドをオーバーライドする

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

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。