メソッドのオーバーライドについて(Rubyの場合)
Q.なぜこの記事を書こうと思ったのか?
A.オブジェクト指向を調べていた時、オーバーライドについて興味が湧いたから。
【結論】オーバーライドとは?
A. スーパクラスから継承されたサブクラスにおいて、メンバ関数を独自の機能で上書きすること
自分はスーパークラスのメソッドを「再定義」することと認識した。
まとめ
- メソッドをオーバーライドする方法と、
スーパークラスのメソッドを呼び出す方法を知れた。 - superに()をつけないと引数がそのままスーパークラスのメソッドにわたされること
- superに()を付けるとスーパークラスのメソッドが引数なしで呼び出されることがわかった。
実際に簡単なコードでメソッドをオーバーライド(メソッドの再定義)する。
1.Dogクラスを継承したLionクラスを作る
class Dog def wanwan return "わんわん" end end class Lion < Dog end animal = Lion.new puts animal.wanwan #クラスの継承を利用したプログラムを実行する #出力結果 #irb(main):012:0> わんわん
2.Lionクラスでwanwanメソッドをオーバーライド(メソッドの再定義)する
class Dog def wanwan return "わんわん" end end class Lion < Dog def wanwan return "バウバウ" end end animal = Lion.new puts animal.wanwan #オーバーライドしたメソッドを利用する #出力結果 #irb(main):028:0> バウバウ
3. スーパークラスのメソッドを呼び出す
class Dog def wanwan return "わんわん" end end class Lion < Dog def wanwan(test) if test return "バウバウ" else return super() end end end animal = Lion.new puts animal.wanwan(true) puts animal.wanwan(false) #スーパークラスのメソッドを呼び出す #出力結果 #irb(main):018:0> バウバウ #irb(main):019:0> わんわん #試しにsuperの後の()を削除して実行する。 #その場合、サブクラスのwanwanメソッドに指定した引数が #そのままスーパークラスのwanwanソッドに渡される。 #しかし、スーパークラスのwanwanメソッドは引数のないメソッドなのでエラーとなる irb(main):018:0> バウバウ => nil irb(main):019:0> Traceback (most recent call last): 4: from /Users/USERNAME/.rbenv/versions/2.5.1/bin/irb:11:in `<main>' 3: from (irb):19 2: from (irb):12:in `wanwan' 1: from (irb):2:in `wanwan' ArgumentError (wrong number of arguments (given 1, expected 0))
4.オーバーライドしたメソッドで機能を追加する
class Dog def iam puts "犬です" end end class Lion < Dog def iam super puts "ライオンです" end end animal = Lion.new animal.iam #オーバーライドしたメソッドで機能を追加する例を実行する #出力結果 #irb(main):037:0> 犬です #ライオンです