Ruby~クラス3~
こんにちは、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でした。