はじめに
前回はクラスの基本的な概念をアウトプットしました。
今回はもう少し踏み込んだ内容について書かせていただきます。
クラスの継承
前回のタイヤキの話でクラスは共通部分を再利用できるので効率がいい。例えば新商品が出ても元のタイヤキをアレンジするだけでいい、それが共通部分を再利用できるということです。
みたいなわかりにくい説明してたと思うんですが、その話を踏み込んでいきます。
クラスというのは親子関係を作ることができるのです。
元々あるクラスの情報をもとにして新しいクラスを作るということです。これを「クラスの継承」と呼びます。
元となったクラスのことはスーパークラスと言います。
スーパークラスをもとに作られた新しいクラスはサブクラスと言います。
クラスの継承を使うと共通部分をまとめることができるので非常に効率的なのです。
今回は車を例に説明をしていきたいと思います。
例えば、パトカー、消防車、救急車のクラスを作る時には、自動車という三つともに共通する情報があるクラスを作成し、そこから派生をする形でそれらの三つのクラスを作成した方が効率的ですよね。
一から設計図を書き直すより、エンジンの構造とかアクセル、ブレーキの構造など同じ部分があるならそれは継承してあげた方が楽っていう話です。
継承の仕組み
継承の仕方は
新しいクラス < もとになるクラス
です。
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クラスのインスタンス変数とインスタンスメソッドを使うことができています。
インスタンスメソッドの追加
もちろんサブクラス独自のインスタンスメソッドを追加することもできます。
特に深く考えずにサブクラス内に普通にメソッドを定義してあげれば問題ないです。
下記が例です。
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
# ターミナル出力結果
# ウゥ〜ウゥ〜
新たな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メソッドと同じ名前のinfoメソッドがサブクラスのPoliceCarクラスにも定義されていて、さらにpolice_carに対してそれを使うと、見事にサブクラス側で定義された結果が出力されます。
最後に
クラスに関してはなんとなく頭でわかっていても、継承したりすると、なんだか記述が似てきたりして混乱することがあります。
この考え方は他の言語にも存在するのでよく理解しておきたいです。