前回はオーバーライドという手法について説明しました。
今回はポリモーフィズムという概念を考えていきたいと思います。
なお、掲載しているコードは実際のゲーム中で使われているものと異なります。
ポリモーフィズム
オーバーライドは親クラスにあるのと同名メソッドを子クラスでも使用していましたが、中には「そんなの別名のメソッドを作ればいいのでは?」と考える人もいるかもしれません。
オブジェクト指向には、ポリモーフィズム(多態性)という概念があります。
ポリモーフィズムは、複数のクラスが同一名称のメソッドを持ちうる、という性質です。
これにより、同じ機能を持ったメソッドを別名で定義する必要がなくなり、プログラムの書きやすさが格段に上がります。
例えば、ピカチュウやニャースは「なきごえ」という技を覚えます。
どのポケモンが使っても、「相手の『攻撃』ランクを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>
コメント