【ぽりもーふぃずむ】

ポリモーフィズム とは?

最終更新:
💡 共通の操作で、種類に応じた振る舞いを使う

共通の操作や記述で、異なる型の値を扱う考え方。オブジェクト指向では共通のインターフェースを通して型に応じた振る舞いを使う例があり、広い意味ではジェネリクスなども含む。

📌 このページのポイント
共通の呼び出しから、種類に応じた振る舞いへ 共通の操作を呼ぶ speak() 🐶 Dog 🐱 Cat 🐦 Bird 犬の実装 猫の実装 鳥の実装 ワン! ニャー! ピヨ! 共通の契約を通じ、型ごとの振る舞いを使う
サブタイプ多態性の模式例。上の矢印は共通操作の呼び出し、下の矢印は各実装の結果を示す。継承の向きを表す図ではなく、ジェネリクスなどを含む多態性全体を示すものでもない。
ひよこ ひよこ
同じ命令で違う動きをするって、どういうこと?
ペンギン先生 ペンギン先生
たとえば共通のspeak()という操作で、犬は「ワン」、猫は「ニャー」、鳥は「ピヨ」と返す例だよ。利用側は共通の操作の契約を使い、実際の振る舞いは対象の型に応じて変わる。これはサブタイプ多態性の例なんだ。
ひよこ ひよこ
何が便利なの?
ペンギン先生 ペンギン先生
呼び出す側を、共通のインターフェースに依存する形にできるよ。契約を満たす新しい型を加えたとき、利用側の変更を減らせる場合がある。ただし、型が違っても意味や必要な振る舞いが合うことは確認するんだ。
ひよこ ひよこ
オーバーライドとオーバーロードは違うの?
ペンギン先生 ペンギン先生
違う仕組みだよ。Javaの例なら、オーバーロードは同じ名前で引数の数や型などが異なるメソッドを用意し、コンパイル時に呼ぶシグネチャを選ぶ。オーバーライドしたインスタンスメソッドの実装は、実行時に対象の型に応じて選ばれるんだ。
ひよこ ひよこ
継承がない言語では使えない?
ペンギン先生 ペンギン先生
継承だけが方法ではないよ。Pythonのダックタイピングのように、必要な操作を提供するかを重視して異なる型を扱う方法もある。同じ操作名があるだけで意味まで同じとは限らないので、利用側が期待する契約も大切なんだ。
ひよこ ひよこ
多態性は、すべて実行時に処理が切り替わるの?
ペンギン先生 ペンギン先生
広い意味ではそれだけではないよ。ジェネリクスのように型を抽象化し、同じコードを複数の型に使う形も多態性に含まれる。動物の例は入口として便利だけれど、あらゆる多態性を継承や実行時の切り替えだけで説明しないんだ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「ポリモーフィズム」って出てきたら「異なる型を、共通の操作や記述で扱う考え方」と思えばだいたいOK!
📖 おまけ:英語の意味
「Polymorphism」 = 異なる形をとること
💬 異なる形をとるという意味の言葉だよ。プログラミングでは、異なる型に対して共通の操作や記述を使う考え方を表す。動物ごとに鳴き方が変わる例は、その一つの形なんだ。

参考資料

← 用語集にもどる