オーバーライドとオーバーロード

 
オーバーライドが成立する条件はメソッド名の同値性だけ。
たとえば以下の例


class Animal
def speak
"hello"
end
end

class Dog < Animal
def speak(word)
"hello " + word
end
end

dog = Dog.new

puts dog.speak => 14:in 'speak': wrong number of arguments (0 for 1) (ArgumentError)

  • Animalクラスのspeakは引数付きのspeak(word)にオーバーライドされたため、引数無しのspeakメソッドは存在しないのでエラーになる。
  • Javaの場合はこのケースではオーバーライドではなくオーバーロードになるのでエラーにならない。
Rubyのメソッドは引数の組み合わせをシグニチャとして認識していないので、同じクラスの中で引数の異なる同名メソッドを定義することができない。つまりRubyには言語仕様としてオーバーロードが無い。

ただしオプション引数を使ったりメソッド内で型を調べて場合分けすることで、オーバーロード相当の機能を実現することは可能。
(参考 http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/1401)