LoginSignup
4
2

More than 5 years have passed since last update.

Ruby クラス 応用編

Last updated at Posted at 2018-09-19

継承

あるクラスを元にして新たなクラスをつくることを「継承」と呼びます。

「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 クラス名.メソッド名

クラスメソッドは定義時と同じように、「クラス名.メソッド名」とすることで呼び出すことができます
また、クラスメソッドはクラスの中でも、同じように呼び出すことができます。

おわり

Ruby 基礎
Ruby 基礎(配列について)
Ruby メソッド
Ruby クラス

4
2
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
2