Ruby Ⅴ

継承とは
継承
あるクラスを元にして新たなクラスをつくることを「継承」と呼びます。
「class 新しいクラス名 < 元となるクラス名」とすることで他のクラスを継承して、新しいクラスを定義することができます。
このとき、新しいクラスは「子クラス」、元となるクラスは「親クラス」と呼ばれます。

# requireを使ってmenu.rbを読み込んでください
require “./menu”

# Menuクラスを継承したFoodクラスをつくってください
class Food < Menu
end

# requireを使ってfood.rbとdrink.rbを読み込んでください
require “./food”
require “./drink”

# Foodクラスのインスタンスを生成して変数food1に代入してください
food1 = Food.new(name: “ピザ”, price: 800)

# food1に対してinfoメソッドを呼び出して戻り値を出力してください
puts food1.info

# Drinkクラスのインスタンスを生成して変数drink1に代入してください
drink1 = Drink.new(name: “コーラ”, price: 300)

# drink1に対してinfoメソッドを呼び出して戻り値を出力してください
puts drink1.info

require “./menu”

class Food < Menu
# calorieというインスタンス変数を追加してください
attr_accessor :calorie
end

require “./food”
require “./drink”

food1 = Food.new(name: “ピザ”, price: 800)
drink1 = Drink.new(name: “コーラ”, price: 300)

# food1.calorieに「700」を代入してください
food1.calorie = 700

# food1.calorieを出力してください
puts food1.calorie

# drink1.amountに「500」を代入してください
drink1.amount = 500

# drink1.amountを出力してください
puts drink1.amount

オーバーライドの仕組み
オーバーライドについてもう少し見てみましょう。
図のように、子クラスのインスタンスは、子クラスで定義したメソッドを優先して呼び出すようになっています。したがって、子クラスと親クラスに同名のメソッドがある場合は子クラスのメソッドを呼び出すので、結果的にメソッドの内容が上書きされたようになります。

Dateクラスの読み込み
Dateクラスrequire
日付を扱うためには、Dateクラスというものを用います。
DateクラスとはRubyがすでに用意しているクラスで、図のようにrequireを用いて読み込むことで、自分でクラスを定義しなくても使うことができます。
このようにすでに用意されているクラスは、requireの書き方が少し異なるので注意しましょう。

require “date”

# 変数todayに、Date.todayの戻り値を代入してください
today = Date.today

# 変数todayをputsしてください
puts today

# 変数todayに対してsunday?メソッドを用いた結果をputsしてください
puts today.sunday?

クラスメソッドの定義
クラスメソッド
クラスメソッドは、「def クラス名.メソッド名」とすることで定義できます。インスタンスメソッドとの違いはメソッド名の前にクラス名を書く必要がある点です。
今回はMenuクラスに、「is_discount_day?」というクラスメソッドを定義してみましょう。

def Menu.is_discount_day?
# 日曜日であればtrue、そうでなければfalseを返してください
today = Date.today
return today.sunday?
end

インスタンスメソッドと
クラスメソッド
インスタンスメソッドクラスメソッド
インスタンスに対して呼び出すメソッドは「インスタンスメソッド」、クラスに対して呼び出すメソッドは「クラスメソッド」という違いを、ここで復習しておきましょう。

require “date”

class Menu
attr_accessor :name
attr_accessor :price

def initialize(name:, price:)
self.name = name
self.price = price
end

def info
return “#{self.name} #{self.price}円”
end

def get_total_price(count)
total_price = self.price * count
if count >= 3
total_price -= 100
end

# if文を作成してください
if count >= 1 && Menu.is_discount_day?
total_price -= 100
end

return total_price
end

def Menu.is_discount_day?
today = Date.today
return today.sunday?
end
end

シェアする

  • このエントリーをはてなブックマークに追加

フォローする