#継承
あるクラスを元にして新たなクラスをつくることを「継承」と呼びます。
「class 新しいクラス名 < 元となるクラス名」とすることで他のクラスを継承して、新しいクラスを定義することができます。
このとき、新しいクラスは「子クラス」、元となるクラスは「親クラス」と呼ばれます。
例)
class 子クラス < 親クラス
end
継承をすると子クラスには、親クラスのインスタンスと変数とインスタンスメソッドが引き継がれる。
##子クラスにインスタンス変数,インスタンスメソッドを追加する
子クラスにインスタンス変数を追加するためには、これまで通り「attr_accessor」を用います。
例)
class 子クラス < 親クラス
attr_accessor :〇〇 # 子クラスにインスタンス変数「〇〇」を追加
def 〇〇_△△ # 子クラスにインスタンスメソッドを追加
...
end
end
#オーバーライド
親クラスにあるメソッドと同じ名前のメソッドを子クラスで定義すると、メソッドを上書きすることができます。これをメソッドの「オーバーライド」と呼びます。
オーバーライドをすると、子クラスのインスタンスは、親クラスのメソッドではなく、子クラスで定義したメソッドを呼び出すようになります。
例)
親クラス
class 〇〇
...
def △△
...
end
end
子クラス
class △△ < 〇〇
...
def △△ # メソッド△△の上書き
...
end
end
##オーバーライドの仕組み
子クラスのインスタンスは、子クラスで定義したメソッドを優先して呼び出すようになっています。したがって、子クラスと親クラスに同名のメソッドがある場合は、子クラスのメソッドを呼び出すので、結果的にメソッドの内容が上書きされたようになります。
##super
オーバーライドしたメソッドの中で「super」とすることで、親クラスの同名のメソッドを呼び出すことができます。
あくまでメソッドを呼び出しているので、親クラスのメソッドの定義に合わせて、superに対して引数を渡す必要があります。
例)
親クラス
class 〇〇
attr_accessor:△△
attr_accessor:□□
def initialize(△△:,□□:)
self.△△ = △△
self.□□ = □□
end
end
子クラス
class △△ < 〇〇
attr_accessor :◇◇
def initialize(△△:,□□:,◇◇:)
super(△△: △△, □□: □□)
self.◇◇ = ◇◇
end
...
end
##Dateクラス
DateクラスとはRubyがすでに用意しているクラスで、日付を扱う際に用います。
require "date" # dateクラスの読み込み
このようにrequireを用いて読み込むことで、自分でクラスを定義しなくても使うことができます。
##Dateクラスのインスタンス
Dateクラスは今まで扱ってきたクラスと同様に、Date.newとすることでインスタンスを生成することができます。
例)
require "date"
date1 = Date.new(1993,3,2)
puts date1
コンソール
1993-03-02
Dateクラスのインスタンスをputsすると、このようにその日付を表示することができます。
##Dateクラスのインスタンスメソッド
Dateクラスには多くのインスタンスメソッドが用意されています。
その中の一つに、Dateクラスのインスタンスの日付が、「日曜日かどうか」を真偽値で返すsunday?メソッドというものがあります。
例)
require "date"
date1 = Date.new(1993,3,2)
puts date1.sunday?
コンソール
false
##今日の日付のDateインスタンスを取得する
Date.todayとすることで、今日の日付のインスタンスをつくることができます。
例)
require "date"
date1 = Date.today
puts date1
コンソール
2018-09-17
#クラスメソッドの定義
クラスメソッドとは、クラスに対して呼び出すメソッドのことです。
クラスメソッドは、「def クラス名.メソッド名」とすることで定義できます。インスタンスメソッドとの違いはメソッド名の前にクラス名を書く必要がある点です。
例)
class クラス名
...
def クラス名.メソッド名
...
end
end
puts クラス名.メソッド名
クラスメソッドは定義時と同じように、「クラス名.メソッド名」とすることで呼び出すことができます
また、クラスメソッドはクラスの中でも、同じように呼び出すことができます。