クラスを継承する

広告

クラスはオブジェクトの元になる設計図のようなものだと今まで説明してきましたが、利用したい全てのクラスを1から作成していると大変ですし共通する部分も複数のクラスに重複して定義する必要があります。

そこであるクラスが既に作成されていて、そのクラスを拡張して新しいクラスを作成することが可能です。このように他のクラスをベースとして新しいクラスを作成することをクラスの継承と言います。

例えば車という基本的なクラスを作成しておいて、そのクラスを継承して個別の車種のクラスを作成することが出来るようになります。車と言う基本機能に関する部分を別のクラスとして定義しておき、個別の車については車のクラスを継承して差分だけを個別に定義するといったことになります。

クラスの継承の仕方

それではクラスを継承する方法を確認していきます。まずは基本となるクラスである「Car」クラスを定義してみます。

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

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

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

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

end

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

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

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

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

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

クラスを継承した場合、クラス自体で定義されたメソッドの他に親クラスで定義されているメソッドも使用することが出来ます。先ほどの例で言えば「Soarer」クラスのオブジェクトは「openRoof」メソッドの他に「accele」メソッドや「brake」メソッドも実行することが出来ます。

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

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

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

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

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

「Crown」クラスに固有のメソッドだけを定義しています。

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

サンプルプログラム

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

InheritTest1.rb

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

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

class Soarer < Car
  def openRoof
    print("ルーフを開けました¥n")
  end
end

class Crown < Car
  def reclining
    print("シートをリクライニングしました¥n")
  end
end

soarer = Soarer.new
soarer.openRoof
soarer.accele

crown = Crown.new
crown.reclining
crown.brake

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

クラスの継承

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

( Written by Tatsuo Ikura )