4
1

More than 3 years have passed since last update.

Rubyの継承について

Last updated at Posted at 2020-07-10

プログラミングの勉強日記

2020年7月11日 Progate Lv.175
RubyⅤ

継承

 クラスを1から作ることもできるが、すでにあるクラスを利用してそのクラスを元に新しいクラスを作れる。そうすることで共通部分をまとめることができ、効率的にコードが書ける。
 あるクラスをもとにして新たなクラスを作ることを継承という。class 新しいクラス名 < 元となるクラス名で他のクラスを継承して新しいクラスを定義することができる。新しいクラスは「子クラス」、元となるクラスは「親クラス」という。
 親クラスのインスタンスメソッドが引き継がれる。

food.rb
require "./menu"
class Food < Menu
end

子クラスのインスタンスは、継承すると子クラスは親クラスのインスタンスメソッドを引き継ぐ。

index.rb
food1=Food.new
puts food1.name
puts food2.info
menu.rb
class Menu
  attr_accessor :name 
  #処理
  def info
    return "#{self.name} #{self.price}円"
  end
end

インスタンス変数の追加

 子クラスにインスタンス変数を追加するためには今まで通りattr_accessorを使う。

menu.rb
class Menu
  attr_accessor :name 
  attr_accessor :price
end

FoodクラスはMenuクラスを継承しているので。「name, price, calorie」の3つのインスタンス変数を持つ。

food.rb
class Food < Menu
  #Foodクラスにcalorieを追加する
  attr_accessor :calorie
end

同様にしてインスタンスメソッドも追加することができる。

オーバーライド

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

index.rb(メソッドを呼び出す)
food1~Food.new(...)
food1.calorie=700
puts food1.info
menu.rb(親クラス)
class Menu
  #処理
  def info
    #処理
  end
end
food.rb(子クラス)
class Food < Menu
  #処理
  #メソッドの上書き(上書きしたメソッドが呼び出される)
  def info
    #処理
  end
end

 子クラスのインスタンスは子クラスで定義したメソッドを優先して呼び出す。よって、子クラスと親クラスに同じ名前のメソッドがある場合は、子クラスのメソッドの内容が上書きされる。initializeメソッドでもオーバーライドができる。

super

 オーバーライドしたメソッドの中でsuperとすることで、親クラスの同じ名前のメソッドを呼び出せる。superではメソッドを呼び出しているので、親クラスのメソッドに合わせてsuperに対して引数を渡す必要がある。

menu.rb
class Menu
  attr_accessor :name 
  attr_accessor :price
  def initialize(name:, price:)
    self.name=name
    self.price=price
  end
end
food.js
class Food < Menu
  attr_accessor :calorie
  def initialize(name:, price:, calorie:)
    super(name: name, price: price)
    self.calorie=calorie
  end
end

0711.png

Dateクラス

 日付を扱うクラス。DateクラスはRubyがすでに用意しているクラスで、requireでdateを読み込むことでクラスを定義しなくても使える。すでに用意されているクラスは他とはrequireの書き方が異なる

index.rb
# "/date"ではない!
reruire "date"

Dateクラスのインスタンス

 Date.newでインスタンスを生成できる。Date.todayで今日の日付のインスタンスを作れる。

index.rb
require "date"
#引数に「年・月・日」を渡してDateメソッドを作成
date1=Date.new(2020,7,8)
puts date
コンソール
2020-07-08

Dateクラスのインスタンスメソッド

 多くのインスタンスメソッドがある。日曜日かどうかを真偽値で渡すのはsunday?メソッド。

index.rb
require "date"
date1=date1.new(2020,7,11)
puts date1.sunday?
コンソール
false

クラスメソッド

 クラスに対して呼び出すメソッドのこと。Date.todaytodayのとこ。クラスメソッドはdef クラス名.メソッド名とすることで定義できる。インスタンスメソッドと異なり、メソッド名の前にクラス名を書く。
 クラスメソッドの呼び出しは、クラス名.メソッド名とする。

menu.rb
class Menu
  #処理
  #今日の日付が日曜日かどうかを真偽値で返す
  def Menu.is_discount_day?  
    #今日の日付の情報を持つDateインスタンス
    today=Date.today
    return today.sunday
  end
end
puts Menu.is_discount_day?

インスタンスメソッドの中でクラスメソッドを呼び出す

menu.rb
class Menu
  #処理
  def get_total_price  #インスタンスメソッド
    if Menu.discount_day?  #クラスメソッドの呼び出し
      #処理
    end
  end
end

0711-1.png

4
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1