ポケモンを例に考えるオブジェクト指向~ポリモーフィズム~

前回はオーバーライドという手法について説明しました。

今回はポリモーフィズムという概念を考えていきたいと思います。

なお、掲載しているコードは実際のゲーム中で使われているものと異なります。

スポンサーリンク
スポンサーリンク

ポリモーフィズム

オーバーライドは親クラスにあるのと同名メソッドを子クラスでも使用していましたが、中には「そんなの別名のメソッドを作ればいいのでは?」と考える人もいるかもしれません。

オブジェクト指向には、ポリモーフィズム(多態性)という概念があります。

ポリモーフィズムは、複数のクラスが同一名称のメソッドを持ちうる、という性質です。

これにより、同じ機能を持ったメソッドを別名で定義する必要がなくなり、プログラムの書きやすさが格段に上がります

例えば、ピカチュウやニャースは「なきごえ」という技を覚えます。

どのポケモンが使っても、「相手の『攻撃』ランクを1段階下げる」という効果は変わりません。

しかし、使用するポケモンによって、この技を使用したときの音声が変わります。

プログラミング言語Rubyで書いてみる

ポケモンクラスを継承したピカチュウ、ニャースというクラスを作成し、ポケモンクラスで定義したgrowlというメソッドをそれぞれオーバーライドします。

# クラス定義
class Pokemon
  attr_accessor :attack_rank

  # growlメソッドを定義
  def growl(opponent_pokemon)
    opponent_pokemon.attack_rank -= 1 if opponent_pokemon.attack_rank > -6
  end

  private

  def initialize
    self.attack_rank = 0
  end
end

class Pikachu < Pokemon
  def growl(opponent_pokemon)
    super(opponent_pokemon) # Pokemonクラスのgrowlメソッドを実行
    puts 'ピカ、ピカチュウ!'
  end
end

class Meowth < Pokemon
  def growl(opponent_pokemon)
    super(opponent_pokemon) # Pokemonクラスのgrowlメソッドを実行
    puts 'ニャースでニャース!!'
  end
end

# インスタンス生成
pikachu = Pikachu.new
meowth = Meowth.new

# growlメソッドでattack_rankが下がりつつ鳴き声を発するのを確認
p meowth
pikachu.growl(meowth) # ピカチュウがニャースになきごえを使用
p meowth

puts '------------------------------------------------------'

p pikachu
meowth.growl(pikachu) # ニャースがピカチュウになきごえを使用
p pikachu

出力例

#<Meowth:0x000055feea500bb0 @attack_rank=0>
ピカ、ピカチュウ!
#<Meowth:0x0000562e45a0cbb0 @attack_rank=-1>
------------------------------------------------------
#<Pikachu:0x000055feea500bd8 @attack_rank=0>
ニャースでニャース!
#<Pikachu:0x000055feea500bd8 @attack_rank=-1>

コメント