すっきりわかるJava入門のp491からp592を読んで特に納得できた多態性について書きます。
#多態性(ポリモーフィズム)とは
多態性とはざっくり言うと、厳密には違う複数の似たようなものを同じものとして扱うことができる概念です。参考書にはお札(紙幣)で例えてありました。
原始人に1万円札を渡すと、絵の描いてある紙だと捉える。これを見て楽しむことはあってもなにかに使えるとは思わない。
人間に1万円札を渡すと喜ぶ。なぜならその紙が紙幣であり、ものと交換できるのを知っているから。
こんな感じです。
要するに「同じものでも違う捉え方ができる」、「それを何と捉えるかによって利用方法が変わる」ということです。
継承関係で表すと、紙←絵の描いてある紙←紙幣という感じでしょうか。
紙は水をふき取るというメソッドを持ってます。絵の描いてある紙は加えて見て楽しむというメソッドを持ちます(絵を見ても楽しめないという人は今回考慮しません。人は皆絵を見て楽しみます。)。そして紙幣は前者2つのメソッド+物と交換できるというメソッドが加わります。重要なのは紙幣にも「水を拭く」「見て楽しむ」メソッドがあるということです。紙幣を何と捉えるかによって使用用途が増えるのです。
コンピュータには紙を何と捉えさせるかこちらが指定する必要があるみたいです。
#多態性のメリット
具体的にどういった場面で多態性の概念が役に立つのか、参考書のコードを使って説明します。
public class Main {
public static void main(String[] args){
Character[] c = new Character[5];
c[0] = new Hero();
c[1] = new Hero();
c[2] = new Thief();
c[3] = new Wizard();
c[4] = new Wizard();
//宿屋に泊まる
for (Character ch :c ) {
//HPを50回復
ch.addHp(50);
}
}
}
この参考書はRPGを作っているという設定のコードが書いてあります。
職業がバラバラの5人のパーティが宿屋に泊まり、全員のHPを50回復するという処理を行っています。
職業のクラス(Hero、Thief、Wizard)は全てCharacter型を継承しているものとします。
ここでは、それぞれの職業のクラスのインスタンスを全てスーパークラスのCharacter型のcという配列に格納しています。そしてこのcの要素のをfor文で回し、職業クラスが持っているaddHpというメソッドでHPに50を足しています。
この、スーパークラス型の変数にサブクラス型のインスタンスを格納できるということが、多態性の特徴であり、メリットです。厳密には違うクラスですが、代入ができます。
もしこれができない仕様だった場合、それぞれの職業クラスのそれぞれのインスタンスのHPを50回復するという処理を1行ずつ書かなくてはなりません。インスタンスが1000個とかになると大変です。
このように、似たようなものをざっくりと同じものとして捉えることで、プログラマーが楽をできるというのが多態性です。
#まとめ
多態性とは違うものをざっくりと同じものとして捉えられる性質。
逆に言えば、同じものを少し差異をつけて、違うものとして扱うこともできる。
この性質により、プログラマーはさまざまなメリットを享受できる。