クラスを継承する

定義済みのクラスの機能を引き継いで新しいクラスを定義することができます。このように他のクラスをベースとして新しいクラスを定義することをクラスの継承と言い、元になったクラスのことをスーパークラス、継承して定義したクラスのことを子クラスと呼びます。ここでは Ruby でクラスを継承する方法について解説します。

(Last modified: )

クラスを継承する

クラスを継承して新しいクラスを定義する方法です。具体的に作成しながら確認してみます。まずは基本となるクラスである「Car」クラスを定義します。

class Car
  def accele
    puts("アクセルを踏みました")
  end

  def brake
    puts("ブレーキを踏みました")
  end
end

次に「Car」クラスを継承した「SportsCar」クラスを作成してみましょう。クラスを継承するにはクラス名の後に「<」を付けて敬称したいクラス名を記述します。

class クラス名 < 継承したいクラス名

end

よって次のように記述します。

class Car
  def accele
    puts("アクセルを踏みました")
  end

  def brake
    puts("ブレーキを踏みました")
  end
end

class SportsCar < Car
  def openRoof
    puts("ルーフを開けました")
  end
end

今回は「SportsCar」クラスが「Car」クラスを継承しています。この時「Car」クラスは「SportsCar」クラスのスーパークラス又は親クラスと言い、「SportsCar」クラスは「Car」クラスのサブクラス又は子クラスと言います。

クラスを継承した場合、クラス自体で定義されたメソッドの他に親クラスで定義されているメソッドも使用することができます。先ほどの例で言えば「SportsCar」クラスのインスタンスは、「SportsCar」クラスで定義されている「openRoof」メソッドの他にスーパークラスで定義されている「accele」メソッドや「brake」メソッドも呼び出すことができます。

ここでもう1つ「FamilyCar」クラスを「Car」クラスを継承して設計してみます。

class Car
  def accele
    puts("アクセルを踏みました")
  end

  def brake
    puts("ブレーキを踏みました")
  end
end

class SportsCar < Car
  def openRoof
    puts("ルーフを開けました")
  end
end

class FamilyCar < Car
  def reclining
    puts("シートをリクライニングしました")
  end
end

「SportsCar」も「FamilyCar」も同じ「Car」クラスを継承しています。共通する機能は「Car」クラスで定義し、独自の機能だけを継承したクラスで定義しています。

「SportsCar」クラスのインスタンスはスーパークラスで定義されているメソッドは呼び出すことができますが、同じスーパークラスを継承した「FamilyCar」クラスで定義されているメソッドは呼び出すことができません。

クラスを継承しない場合には「Soarer」クラスでも「Crown」クラスでも「accele」メソッドや「brake」メソッドを個別に定義する必要がありました。クラスを継承することで共通した部分は基本となるクラスとして抜き出すことができます。その結果、プログラムの再利用性も高まり、また必ず備えていなければならないメソッドなどを忘れずに備えることができます。

サンプルコード

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

# encoding: UTF-8

class Car
  def accele
    puts("アクセルを踏みました")
  end

  def brake
    puts("ブレーキを踏みました")
  end
end

class SportsCar < Car
  def openRoof
    puts("ルーフを開けました")
  end
end

class FamilyCar < Car
  def reclining
    puts("シートをリクライニングしました")
  end
end

sc = SportsCar.new
sc.openRoof
sc.accele

puts()

fc = FamilyCar.new
fc.reclining
fc.brake

上記を実行すると次のように表示されます。

クラスの継承

クラス内で定義されたメソッドだけではなく、スーパークラスで定義されているメソッドも呼び出すことができました。

-- --

Ruby でクラスを継承する方法について解説しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

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