読者です 読者をやめる 読者になる 読者になる

メソッドのオーバーライド

親クラスから小クラスへと継承した際に、元のメソッドをオーバーライドすると、くさいコードが消えました。

そこで、オーバーライドについて調べました。

例えば、下記のようなクラスがあったとします。

class Japanese
  def hello
    puts 'こんにちは'
  end
end

class American < Japanese
end

japanese = Japanese.new
japanese.hello
=>こんにちは

american = American.new
american.hello
=>こんにちは

こういうことになります。

これだと、アメリカ人が日本語をしゃべるので、英語で挨拶をしたいのに!ってなります(そういう設定)

なので、Japaneseのメソッドをオーバーライド(上書き)します。

class Japanese
  def hello
    puts 'こんにちは'
  end
end

class American < Japanese
  def hello
    puts 'hello'
  end
end

japanese = Japanese.new
japanese.hello
=>こんにちは

american = American.new
american.hello
=>hello

いやいや、継承しているので、バイリンガルでしょ?って場合はこういう風にします。

class Japanese
  def hello
    puts 'こんにちは'
  end
end

class American < Japanese
  def hello
    super
    puts 'hello'
  end
end

japanese = Japanese.new
japanese.hello
=>こんにちは

american = American.new
american.hello
=>こんにちは
     hello

追記

オーバーライドした方に引数がある場合です

その場合は元のメソッドにはないので、super()と書いてあげます。

class Japanese
  def hello
    puts 'こんにちは'
  end
end

class American < Japanese
  def hello(name)
    super()
    puts "#{name} hello"
  end
end

american = American.new
american.hello("foo")
=>こんにちは
=>foo hello

以上です。