継承の仕組み
あるクラスを継承して新しいクラスを作る場合には以下のように「新しいクラス < 元となるクラス」と書きます。
【例】sample.rb
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メソッドを実行すると、上書きされた処理が実行されるようになります。
問問題.1
以下の仕様にしたがってコードを記述してください。
・Personクラスはプロパティ name, ageを持っている。
・StudentクラスはPersonクラスを継承している。
・Studentクラスにはintroduceメソッドが定義されている。実行すると
「私の名前は◯◯です。◯歳です」と表示がされる。
・Studentクラスのインスタンスを作成し、introduceメソッドを実行する。
class Animal
def initialize(name)
@name = name
end
end
class Dog < Animal
def name
puts "名前は#{@name}です。"
end
end
pochi = Dog.new("ポチ")
pochi.name
class Person
def initialize(name,age)
@name = name
@age = age
end
end
class Student < Person
def introduce
puts "私の名前は#{@name}です。#{@age}才です。"
end
end
taro = Student.new("Taro",13)
taro.introduce