メソッドのオーバーライドについて(Rubyの場合)

Q.なぜこの記事を書こうと思ったのか?

teacher.nagano-nct.ac.jp

A.オブジェクト指向を調べていた時、オーバーライドについて興味が湧いたから。

【結論】オーバーライドとは?

A. スーパクラスから継承されたサブクラスにおいて、メンバ関数を独自の機能で上書きすること

自分はスーパークラスのメソッドを「再定義」することと認識した。

まとめ

  • メソッドをオーバーライドする方法と、
    スーパークラスのメソッドを呼び出す方法を知れた。
  • superに()をつけないと引数がそのままスーパークラスのメソッドにわたされること
  • superに()を付けるとスーパークラスのメソッドが引数なしで呼び出されることがわかった。

www.buildinsider.net

実際に簡単なコードでメソッドをオーバーライド(メソッドの再定義)する。

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> 犬です
#ライオンです