【オブジェクト指向入門】多態性(ポリモーフィズム)とは?わかりやすく解説

集団

こんにちは、ハニ太郎(@82_taro)です♪

私たちは日常生活において、無意識に物事を曖昧に捉えたり使ったりすることにより、様々なメリットを享受しています。

本記事で解説する多態性(ポリモーフィズム)」とは、物事を曖昧に捉えるための機能です。

挫折する方が多いテーマですが、コツを理解できさえすればそう難しくはありません。

記事を読み終えた頃には「多態性(ポリモーフィズム)とは何か」理解できていることでしょう。

ハニ太郎

最後まで読んでね♪

多態性(ポリモーフィズム)とは?

「多態性」とは、オブジェクト指向プログラムを支える三大機能の一つで、「ポリモーフィズム」と呼ばれることもあります。

本章ではそんな多態性についてわかりやすく解説していきたいと思います。

多態性(ポリモーフィズム)のイメージ

多態性(ポリモーフィズム)は「あるものをあえてザックリ捉える」ことで様々なメリットを享受しようという機能。

まずはこのように理解しておきましょう。

多態性(ポリモーフィズム)の定義や「多態」の意味については後ほど詳しく説明いたします。

ザックリ捉えるメリット

我々の日常生活でもザックリ捉えることによるメリットが多々あります。

例えば、レンタカーを借りて運転するときのことを考えてみましょう。

厳密に言えば初めて乗る車であるにも関わらず問題なく運転できますよね?

これは車の厳密な車種についてあまり考えておらず、ザックリ「車」としか捉えていないため。

車種が違っていても車は車なのです。

このように私たち人間は世の中にある様々なものをザックリと捉えることによって様々なメリットを享受しています。

このザックリとものを捉えるということをプログラム内で実現する機能こそ「多態性」なのです。

ざっくり捉える方法(Java)

前章にて、ザックリ捉えることで様々なメリットを享受できることは理解できたかと思います。

では、どうすればプログラム内でザックリと捉えることができるのでしょうか?

実はザックリ捉えるための特別な文法は用意されていません。

多態性には特別な文法は存在しないのです。

ではどうするか?

「代入の文法」を使うことでザックリ捉えることができるようになっています。

例えば「Humanクラス」と「Womanクラス」。

女性も人間であることに違いありません。

プログラム内で女性と捉えるのではなく一人間として捉えたいと思った場合は以下のようにコードを記述します。

Java
Human h = new Woman();

*上記はJavaの文法。変数名に意味なし。

ここでは、「new(インスタンス化)する時の左辺と右辺は別に同じクラス型でなくてもいい」というのがポイント。

あるインスタンスをどのように捉えるかはどのクラス型の変数に代入するかで決まると言えます。

ザックリ捉える方法
「代入の文法」を用いる。

しかし、どのクラス型に代入してもいいという訳ではありません。

合言葉は「大は小を兼ねる」です。

ここで継承の本質についておさらいしましょう。

「継承」とは、プログラマーが「is-aの関係」を伝えるための道具でした。

何を言っているのか分からないという方は以下の記事を参考にしてみてください。

>【オブジェクト指向入門】継承とは?(基本編)わかりやすく解説

先ほど述べた「大は小を兼ねる」というのは、「A is-aB(AはBの一種である)」が成り立つ場合、AをBに代入できるということです。

この原則から外れていた場合エラーになります。

そのため、多態性を使いこなすためには継承を使いこなす必要があるのです。

多態性(ポリモーフィズム)のメリット

前章で多態性を用いてインスタンスをザックリ捉える方法を学びました。

ここまで読んできて「多態性のメリットがイマイチわからない」と思っていらっしゃるのでは?

本章ではそんな多態性のメリットについて詳しく解説していきたいと思います。

多態性の大きなメリットは以下の二つ。

  1. 同一視して配列を利用する
  2. 同一視してザックリとした引数を受け取る

それぞれについて詳しく見ていきましょう。

同一視して配列を利用する

それぞれを別のものと捉えてしまうと以下のようなデメリットがあります。

  1. コードに重複が多い
  2. 将来的に多くの修正が必要となる

しかし、多態性と配列を上手に使えばこの問題は解決します。

全てを同一視(同じ型と捉える)することでループを用いて一括処理することできるのです。

同一視してザックリとした引数を受け取る

引数の型をザックリ捉えることでも大きなメリットを享受することができます。

例えば、あるゲームで主人公がモンスターに攻撃をするためのattack()メソッドがあるとします。

そしてMonsterクラスを継承元とした沢山の種類のモンスター達が存在。

スライムに攻撃する場合もゴーレムに攻撃する場合も同じattack()メソッド。

その場合、それぞれのモンスターに対してattack()メソッドを定義していたら日が暮れてしまいますし、変更する手間も凄まじいものとなります。

そこで多態性の出番です。

attack(Monster m)としたらどうでしょうか?

スライムもゴーレムも同じモンスターに変わりありません。

モンスターに対する攻撃ということならこのメソッド一つで完成。

引数にスライムでもゴーレムでもぶち込んでやればいいのです。

ラクだとは思いませんか?

以上2つが多態性のメリットになります。

おわりに

最後に、なぜ「多態性(ポリモーフィズム)」という名前がつけられているのか説明いたします。

それは呼び出し側は相手を同一視し、同じように呼び出すにも関わらず、呼び出される側はきちんと自分に決められた動きをするからです。

ハニ太郎

ここまで記事を読んでいただきありがとうございました♪

多態性について理解できたでしょうか?

あなたがオブジェクト指向をマスターできるよう応援しております!

コメントを残す