Ruby クラス

既存のクラスの引き継ぎ

Rubyではデータの元となる設計図を作り、その設計図を元に実体となるデータを作るという手順を踏むのでした。

この設計図をクラス、実体となるデータをインスタンスと呼びます。

実はこのクラスは親子関係を作ることができます。親子関係とは、既存のクラスの情報を元に新しいクラスを作るということです。

これを「クラスの継承」と呼びます。

クラスの継承
クラスの継承とは既存のクラスを元に新しいクラスを作ることです。

このとき、新しいクラスを子クラス(またはサブクラス)、元になったクラスを親クラス(またはスーパークラス)と呼びます。

では、なぜクラスの継承が必要なのでしょうか?

それは、クラスの継承を使えば、共通する部分をまとめることができて効率的だからです。

例えば、パトカー、消防車、救急車のクラスを作成するならば、3つに共通する情報をまとめた自動車クラスを作成し、その自動車クラスを継承したクラスを作成したほうが効率的です。

そうすれば、各クラスは自動車が共通して持つ情報を引き継ぎつつ、それぞれ独自の情報を持つことができます。

 

継承の書き方を知ろう
あるクラスを継承して新しいクラスを作る場合には以下のように「新しいクラス < 元となるクラス」と書きます。

【例】

class PoliceCar < Car

end

 

継承されるものを知ろう
クラスを継承すると、親クラスから子クラスへ以下のものが引き継がれます。

親のインスタンス変数
親のインスタンスメソッド
例えば、Carクラスを継承したPoliceCarクラスを作成するコードを以下に示します。

class Car

def initialize(car_type, capacity)
@name = car_type
@capacity = capacity
end

def info
puts "車種:#{@name} 乗車定員:#{@capacity}人"
end

end

class PoliceCar < Car

end

police_car = PoliceCar.new("パトカー", 5)

police_car.info

# ターミナル出力結果
# 車種:パトカー 乗車定員:5人

上記を見てみると、PoliceCarクラスの中には何も記述をしていませんが、継承元のCarクラスのインスタンス変数およびインスタンスメソッドを使うことが確認できます。

 

インスタンスメソッドを追加する方法
続いて子クラスに独自のインスタンスメソッドを追加する方法について学びましょう。

と言っても方法は簡単です。子クラス内に新しくメソッドの定義を追加するだけです。

先ほどのPoliceCarクラスを例に説明をします。以下を見てください。

【例】

class Car
def initialize(car_type, capacity)
@name = car_type
@capacity = capacity
end

def info
puts "車種:#{@name} 乗車定員:#{@capacity}人"
end

end

class PoliceCar < Car

def siren
puts "ウゥ〜ウゥ〜"
end

end

police_car = PoliceCar.new("パトカー", 5)

police_car.siren

# ターミナル出力結果
# ウゥ〜ウゥ〜

上記では、PoliceCarクラス内にsirenメソッドを新たに追加し、それを実行しています。

このように子クラスにインスタンスメソッドを追加することで、そのクラス固有のメソッドを定義することができます。

メソッドを上書きする方法
最後にメソッドを上書きする方法について解説します。

親クラスにあるメソッドと同じ名前のメソッドを子クラスで定義すると、メソッドを上書きすることができます。

これをメソッドの「オーバーライド」と呼びます。

オーバーライド
オーバーライドとは、親クラスのメソッドを子クラスに同名のメソッドを定義することによって上書きすることを指します。

例えば、以下のコードを見てください。

【例】

class Car
def initialize(car_type, capacity)
@name = car_type
@capacity = capacity
end

def info
puts "車種:#{@name} 乗車定員:#{@capacity}人"
end

end

class PoliceCar < Car

def info
puts "車種:#{@name} 乗車定員:#{@capacity}人 パトロール時間:24時間"
end

def siren
puts "ウゥ〜ウゥ〜"
end

end

police_car = PoliceCar.new("パトカー", 5)

police_car.info

# ターミナル出力結果
# 車種:パトカー 乗車定員:5人 パトロール時間:24時間

上記では、Carクラスで定義されたinfoメソッドと同名のメソッドをPoliceCarクラス内で定義しています。

これによって、PoliceCarクラスを元に生成されたインスタンスでinfoメソッドを実行すると、上書きされた処理が実行されるようになります。