アウトプットを頑張る

初めてのプログラミング学習期間中の記録と、日頃読んでいる本をメモのアウトプットをがんばります。

【プログラミング学習】クラスの理解

■プログラミング学習 f:id:yuma6128:20211124200006j:plain

クラスの継承
Rubyでは、データの元になる設計図(クラス)を作り、その設計図を元に実態となるデータ(インスタンス)を作るというのが手順になります。
このクラスに親子関係を作ることをクラスの継承と呼びます
親子関係とは、既存のクラスの情報を元に新しいクラスを作ることを指しています。
このときの、新しいクラスを子クラス(またはサブクラス)、元になった既存のクラスを親クラス(またはスーパークラス)と呼びます。
クラスの継承がなぜ必要なのか。
答えは、クラスの継承を使うことで、共通する部分をまとめることができ、効率的になるからです。

例えば、たんぽぽ、ひまわり、コスモスのクラスを作成するなら、3つに共通する情報をまとめた花というクラスを 作成し、その花クラスを継承したクラスを作成したほうが効率的です。
そうすれば、各クラスは花が共通して持つ情報を引き続きつつ、それぞれ独自の情報を持つことができます

class Flower
  def initialize(flower_type,color)
    @name = flower_type
    @color = color
  end

  def info
    puts "種類:#{@name}、色:#{@color}"
  end
end

class Dandelions < Flower
  
end

dandelions = Dandelions.new("たんぽぽ","黄色")
dandelions.info
# ターミナル出力結果
# 種類:たんぽぽ、色:黄色

上記の通りで、Dandelionsのクラスには、何も記述していませんが、継承元のFlowerクラスのインスタンス変数及び インスタンスメソッドを使うことができます。

子クラスに独自のインスタンスメソッド追加
こちらは子クラスに新しくメソッドを定義するだけになります。

class Flower
  def initialize(flower_type,color)
    @name = flower_type
    @color = color
  end

  def info
    puts "種類:#{@name}、色:#{@color}"
  end
end

class Dandelions < Flower
  def season
   puts ""
  end
end

dandelions = Dandelions.new("たんぽぽ","黄色")
dandelions.season

# ターミナル出力結果
# 春

こちらは、Dandelionsクラス内に、seasonメソッドを新たに追加し、それを実行しています。
このように子クラスにインスタンスメソッドを追加することで、そのクラス固有のメソッドを定義することができます。

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

class Flower
  def initialize(flower_type,color)
    @name = flower_type
    @color = color
  end

  def info
    puts "種類:#{@name}、色:#{@color}"
  end
end

class Dandelions < Flower
  def info
    puts "種類:#{@name}、色:#{@color},属名はタラクサクム属"
   end

  def season
   puts ""
  end
end

dandelions = Dandelions.new("たんぽぽ","黄色")
dandelions.info
# ターミナル出力結果
# 種類:たんぽぽ、色:黄色,属名はタラクサクム属

上記の通り、Flowerクラスで定義されたinfoメソッドと同名のメソッドをDandelionsのクラス内で定義をしています。
これによって、Dandelionsのクラスを元に生成されたインスタンスでinfoメソッドを実行すると上書きされて処理が実行されるようになります。