Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
1
Help us understand the problem. What is going on with this article?
@minhee

[Ruby] クラスをさらに深ぼる

はじめに

前回はクラスの基本的な概念をアウトプットしました。
今回はもう少し踏み込んだ内容について書かせていただきます。

クラスの継承

前回のタイヤキの話でクラスは共通部分を再利用できるので効率がいい。例えば新商品が出ても元のタイヤキをアレンジするだけでいい、それが共通部分を再利用できるということです。

みたいなわかりにくい説明してたと思うんですが、その話を踏み込んでいきます。

クラスというのは親子関係を作ることができるのです。
元々あるクラスの情報をもとにして新しいクラスを作るということです。これを「クラスの継承」と呼びます。

元となったクラスのことはスーパークラスと言います。
スーパークラスをもとに作られた新しいクラスはサブクラスと言います。
クラスの継承を使うと共通部分をまとめることができるので非常に効率的なのです。

今回は車を例に説明をしていきたいと思います。
例えば、パトカー、消防車、救急車のクラスを作る時には、自動車という三つともに共通する情報があるクラスを作成し、そこから派生をする形でそれらの三つのクラスを作成した方が効率的ですよね。

一から設計図を書き直すより、エンジンの構造とかアクセル、ブレーキの構造など同じ部分があるならそれは継承してあげた方が楽っていう話です。

継承の仕組み

継承の仕方は
新しいクラス < もとになるクラス
です。

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に対してそれを使うと、見事にサブクラス側で定義された結果が出力されます。

最後に

クラスに関してはなんとなく頭でわかっていても、継承したりすると、なんだか記述が似てきたりして混乱することがあります。
この考え方は他の言語にも存在するのでよく理解しておきたいです。

1
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
1
Help us understand the problem. What is going on with this article?