FE EXAM

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

同じ呼び出しに対しオブジェクトごとに異なる動作をさせる仕組み。

INTERACTIVE VISUALIZATION
親クラス
子クラス
呼び出し
フェーズ
idle
呼び出し
動作の種類
3 通り
シナリオ
ステップ1 / 6
STEP 1/6親 Animal と子クラスたち親クラス Animal を Dog・Cat・Cow が継承しています。Animal には speak()(=鳴く)という操作が定義されています。まずはこの継承の関係を確認しましょう。クラスとは「データと処理をまとめた型」のことです。
Animalspeak()Dogspeak() Catspeak() Cowspeak()
コードのイメージ
Animal animal = new Dog(); // Cat や Cow に差し替え可
animal.speak(); // 呼び出しは常に同じ
// 中身が Dog → 「ワン」 / Cat → 「ニャー」 / Cow → 「モー」
解説

📌
ポリモーフィズムとは

speak()ワンニャーモー

ポリモーフィズム(多態性)とは、まったく同じメソッド呼び出しに対して、相手のオブジェクト(=モノの実体)の型ごとに異なる動作をさせる仕組みのことです。poly(多くの)+ morph(形)で「多くの形に化ける」という意味の言葉です。

身近な例で考えると、テレビのリモコンの電源ボタンに似ています。どのメーカーのテレビでも「電源ボタンを押す」という操作は同じですが、実際にどう電源が入るかは機種ごとに違います。押す側は中の仕組みを知らなくても、同じ操作で目的を果たせます。

上のツールで▶ボタンを押すと、同じ animal.speak() という呼び出しが、Dog なら「ワン」、Cat なら「ニャー」と、型に応じて違う結果になる流れを確認できます。

🔁
オーバーライドとの関係

Animalspeak()Dogspeak()→ワン同名で中身を上書き

ポリモーフィズムを成り立たせているのがオーバーライド(override)です。これは、親クラスから受け継いだメソッドを、子クラスで同じ名前のまま中身だけ作り替えることを指します。

流れを整理すると次のとおりです。
① 親が共通の操作を用意:Animal が speak() を宣言する
② 子が上書き:Dog・Cat・Cow が speak() を自分用の内容に書き換える
③ 動的束縛:実行時、変数が実際に指す型の speak() が自動的に選ばれる

よく混同されるオーバーロード(overload)とは別物です。オーバーロードは「同じクラス内で、同名だが引数の数や型が違うメソッドを並べる」ことで、こちらは型による動作の切り替えとは関係ありません。

💡
利点

ポリモーフィズムを使うと、呼び出す側を型ごとに場合分けしなくてよくなるのが最大の利点です。

ポリモーフィズムを使わないと、呼び出し側はこんなコードになりがちです。

if (a is Dog) ...「ワン」
else if (a is Cat) ...「ニャー」
else if (a is Cow) ...「モー」 // 型が増えるたびに追記

ポリモーフィズムなら次の1行で済みます。

animal.speak(); // 型が増えても変えなくてよい

主な利点は次のとおりです。
場合分け不要:if文で型を判定する必要がない
拡張に強い:新しい型(Bird など)を足しても呼び出し側を直さなくてよい
見通しが良い:呼び出し側のコードがシンプルに保たれる

📌
なぜポリモーフィズムが便利か

呼び出し側speak()Animalspeak()Dog → ワンCat → ニャーCow → モーBird → ピヨ(新追加)呼び出し側は何も変えなくてよい

ポリモーフィズムが特に便利なのは「新しい種類(型)を追加するとき」です。たとえば後から Bird(鳥)というクラスを追加したいとします。Bird が Animal を継承して speak() を「ピヨ」と上書きするだけで、呼び出し側のコード(animal.speak())は1文字も変えなくてよいのです。

なぜこれが便利なのかというと、呼び出し側と子クラスが「お互いの中身を知らなくてよい」状態になるからです。呼び出し側は「speak()があればOK」とだけ知っていれば済み、中が Dog なのか Cat なのか Bird なのかを気にしません。子クラスも「自分のspeakを実装する」だけです。
なし:新しい型を足すたびにif文を追記 → 呼び出し側も毎回修正が必要
あり:子クラスを追加するだけ → 呼び出し側は無変更のまま動く

身近な例で考えると、スマートフォンのアプリのようなものです。OSは「アプリを起動する」という操作だけ知っています。新しいアプリが増えても、OS側の「起動する」の仕組みを変える必要はなく、アプリ側が「起動されたらこう動く」を定義するだけで済みます。

📌
OOP3要素のまとめ

カプセル化データを隠す窓口で守る「安全」継承親の性質を子が受け継ぐ「再利用」多態性同じ呼び出しで型ごとに違う動作「柔軟」オブジェクト指向(OOP)再利用しやすく・壊れにくい設計3つがそろって初めて真価を発揮する

多態性(ポリモーフィズム)は、OOPの3大要素のうち最後の1ピースです。3つを合わせると次のような役割分担になります。
カプセル化:各オブジェクトのデータを安全に守る(土台の「安全」)
継承:共通部分を親クラスにまとめて再利用する(コードの「再利用」)
多態性:同じ呼び出しで型ごとに柔軟に動作させる(設計の「柔軟さ」)

3つの関係は次のように考えると整理しやすいです。カプセル化がオブジェクト1個を健全に保ち、継承でそのオブジェクトをひな型(親)として再利用でき、多態性で複数の種類を統一した操作で扱えるようになります。

身近な例で全体を振り返ると、テーマパークのアトラクションのようなものです。各アトラクション(オブジェクト)は内部の機械を見せない(カプセル化)、共通の「安全基準」を全アトラクションが引き継ぐ(継承)、そして案内係は「スタート」ボタンを押すだけでどのアトラクションも動き出す(多態性)。これが3要素の協力のイメージです。

練習問題

🎯
基本情報技術者 練習問題

Q1.ポリモーフィズムの説明として最も適切なものはどれか。
A.既存クラスの性質を引き継いで新しいクラスを作ること
B.同じメソッド呼び出しが、オブジェクトの型によって異なる動作をすること
C.データと処理を1つにまとめて外部から隠すこと
D.1つのクラスから多数のインスタンスを生成すること
Q2.ポリモーフィズムとオーバーライドの関係として正しいものはどれか。
A.子クラスで親のメソッドを上書き(オーバーライド)することで、型ごとに異なる動作が実現される
B.オーバーライドとは同名で引数が異なるメソッドを並べることである
C.ポリモーフィズムにオーバーライドは関係しない
D.オーバーライドすると親のメソッドは呼べなくなる
Q3.ポリモーフィズムを使う利点として最も適切なものはどれか。
A.メモリ使用量が必ず減る
B.呼び出し側が型ごとの場合分け(if文)をせずに済み、新しい型の追加にも強くなる
C.すべてのメソッドの実行速度が必ず速くなる
D.クラスどうしの継承関係が不要になる

関連コンテンツ