Ruby~クラス3~

Ruby

こんにちは、kazutoです。今回は、クラスシリーズの続編です。「クラス2」で解説しきれなかった部分について解説してきます。

継承

継承とは、親クラスの情報を子クラスに引き継ぐ事です。クラスを継承した場合、クラス自体で定義されたメソッドの他に親クラスで定義されているメソッドも使用することが出来ます

構文は、下記の通りになります。

class 子クラス < 親クラス
end

構文が確認できた所で、実際にプログラムを組んでみましょう。

class Human
#処理
end
class  Self_introduction < Human
end

こちらは、HumanクラスをSelf_introduction に継承しています。親クラスから情報を引継ぐ事で、親クラスのメソッドを使う事ができます。

class Human
  def initialize(name,age,height,weigth)
    @name   =  name
    @age    =  age
    @height =  height
    @weigth =  weigth
  end
 def greeting
    puts "こんにちは#{@name}です。"
    end
    
   def inheritance
    puts "親クラスから子クラスに継承しました。"
  end
end
class Self_introduction < Human
  def introduction
    puts "私の名前は#{@name}です。"
    puts "年齢は#{@age}です。"
    puts "身長は#{@height}cm,体重が#{@weigth}kg。"
    puts "よろしくおねがします。"
  end
 end
self_introduction=Self_introduction.new("kazuto",21,170,64)
self_introduction.greeting
self_introduction.inheritance

上記を確認していただければ、親クラスのメソッドを呼び出しているのが、わかると思います。継承のメリットは、同じ処理を子クラスで書き直す必要がない点です。

RubyのフレームワークのRuby on Rails などを触った事がある方がいれば、なんとなくクラスの継承の重要性に気づくと思います。
なので、クラス継承まで学んだら、progateなどでRuby on Railsを触ってみるのもありですね。

※Ruby on RailsについてはRubyの解説が一通り終わり次第、記事を執筆していきます。

ゲッター

ゲッターとは,インスタンス変数をクラス内で参照する事ができるメソッドです。インスタンス変数は、クラス内でしか、呼び出す事ができません。なので、クラス外から呼び出すためにゲッターというメソッドを作成する必要があります。

では実際に、ゲッターを定義します。構文を確認しましょう。

 def メソッド名
    インスタンス変数
  end
class Human
  def initialize(name)
   @name =name
  end
#ゲッター
  def name 
   @name
  end
end

上記がゲッターです。単にメソッドの返り値として、インスタンス変数を渡しているだけですね。ゲッターについては、特に難しい事は無いですね。
注意点として、ゲッターではインスタンス変数の更新はできません。更新をしたい場合は、セッターを定義します。

#ゲッターではできない
human.name="jun"

セッター

セッターとは、インスタンス変数の値を更新をするためのメソッドです。参照と同様、値の更新についてもインスタンス変数では、クラス内でしかできません。
なので、値を更新するだけのメソッド、セッターを作成する必要があります。

では実際に、セッターを定義してみましょう。

 def メソッド名=引数
   インスタンス変数=引数
 end
class Human
  def initialize(name)
   @name =name
  end
#ゲッター
  def name 
   @name
  end
#セッター
  def name=(name)
    @name=name
  end
end
human=Human.new("kazuto")
puts human.name
#値の更新
human.name="ken"
puts human.name
#セッター
def name=(name)
    @name=name
  end

上記がセッターです。少しややこしいと感じると思いますが、簡単です。name=というメソッドの引数のnameをインスタンス変数nameに代入しているだけです。

セッターを初めてみると「❓」となりますが、徐々に意味が理解できるようになるので心配しなくとも大丈夫です。

続いて、

  • ゲッター
  • セッター

を簡略できるアクセスメソッドを紹介します。

アクセスメソッド

下記の記述の

  • ゲッター
  • セッター

をアクセスメソッドを用いてリファクタリングしていきましょう。

class Human
  def initialize(name)
   @name =name
  end
#ゲッター
  def name 
   @name
  end
#セッター
  def name=(name)
    @name=name
  end
end
human=Human.new("kazuto")
puts human.name
#値の更新
human.name="ken"
puts human.name

attr_readerメソッド

attr_readerメソッドは、インスタンス変数を参照します。要するにゲッターと同じ役割をするメソッドです。構文を確認してみましょう。

 attr_reader :変数

構文を確認した所で、ゲッター部分をattr_readerメソッドを用いて,書き換えてみましょう。

class Human
  attr_reader :name
  def initialize(name)
   @name =name
  end
# セッター
  def name=(name)
    @name=name
  end
end
human=Human.new("kazuto")
puts human.name
human.name="ken"
puts human.name

ゲッターが定義されている部分を省略する事ができました。attr_readerメソッドを用いる前より、とても可読性が高くなったと思います。
続いて、セッターもメソッドを使って、リファクタリングしていきましょう。

attr_writerメソッド

attr_writerメソッドは、インスタンス変数の値の更新をします。要するにセッターと同じ役割をするメソッドです。構文を確認してみましょう。

attr_writer:変数

構文を確認した所で、セッター部分をattr_writerメソッドを用いて書き換えてみましょう。

class Human
  attr_reader :name
  attr_writer :name
 def initialize(name)
   @name =name
  end
end
human=Human.new("kazuto")
puts human.name
human.name="ken"
puts human.name

セッターを定義していた部分を省略する事ができましたね。attr_writerメソッドを用いた事でより、可読性が高くなりましたね。

  • attr_readerメソッド
  • attr_writerメソッド

で書き直した事によってコード全体がスッキリしました。しかしまだ、リファクタリングが可能です。

  • attr_readerメソッド
  • attr_writerメソッド

上記の2つのメソッドを1つのアクセスメソッドで記述する事が可能です。

最後にattr_accessorメソッドについて解説します。

attr_accessorメソッド

attr_accessorメソッドとは、ゲッター、セッターを一度に定義する事ができるメソッドです
要するに

  • attr_readerメソッド
  • attr_writerメソッド

上記の2つのメソッドの特性を凝縮したメソッドです。構文を確認してみましょう。

attr_accessor: 変数名

構文を確認した所で、attr_accessorメソッドで書き換えてみましょう。

class Human
  attr_accessor :name
  def initialize(name)
   @name =name
  end
end
human=Human.new("kazuto")
puts human.name
human.name="ken"
puts human.name
  • attr_readerメソッド
  • attr_writerメソッド

をattr_accessorメソッドにまとめる事ができました。attr_accessorメソッドは便利な分、何をしているのかがわかりづらいと思います。そんな時は、セッターゲッターについて復習をしてから、attr_accessorメソッドを用いるのがベストだと個人的には思います。

まとめ:Ruby~クラス3~

今回は、

  • クラスの継承
  • セッター
  • ゲッター
  • アクセスメソッド

について解説しました。

少しクラスの概念について理解していないと難しく感じたとは思いますが、ポイントとして

  • 抽象=>具体
  • 具体 =>抽象

を繰り返しているイメージです。一つの仕組みがわからなかった場合は、一度、抽象化してまとめて考えてみれば理解ができるかもしれません。なので、具体=>抽象などを繰り返していきましょう。

以上、kazutoでした。