ポリモーフィズム
出典: フリー百科事典『ウィキペディア(Wikipedia)』
ポリモーフィズム(Polymorphism)とは、主にオブジェクト指向プログラミングで、あるオブジェクトへの操作が呼び出し側(sender)ではなく、受け手のオブジェクト(receiver)によって定まる特性のこと。訳語に多態性、多相性、多様性などの他、読みもポリモフィズム、ポリモルフィズムなど多少揺れがある。
古典的なプログラミング言語では関数や手続きはそれぞれ一意に識別される名前と結びついており、従って異なった動作を実現するためには異なった名前を用いる必要があった。
例えば、何かの値を文字列形式に変換する最も単純な場合を考える。古典的な言語では、次のように別々の関数になっていなければならない。
- 古典的な変換関数:
- 数字を文字列にする場合
string = StringFromNumber(number)
-
- 日付値を文字列にする場合
string = StringFromDate(date)
一方多態を行なう場合では、StringValue のような汎用の述語を定義し、型別にそれぞれ適切な変換方式を定義させることでオブジェクトの種別によらない抽象度の高い変換形式を実現できる。
- 多態を行なう変換方式:
- 見た目上、型によらない変換が可能
string = number.StringValue string = date.StringValue
無論、StringValueの定義は型別に行なわなければならないので、総体として記述量が減少するわけではない(継承による再利用はありうる)。また、何をもって「正しい動作」とするのかはオブジェクトの設計に依存するため、多態を使いこなすにはシステム全体を見通す優れた設計能力が要求される。
[編集] 動的言語と多態
Smalltalkをはじめとする動的ディスパッチ型の言語では、純粋に実行時のオブジェクトで実際のメソッドが判定される。これを「真のポリモーフィズム」などと呼ぶ場合もある。
[編集] 静的言語と多態
C++のような静的言語ではコンパイル時に全ての実行メソッドが決定されるため、多態は名前空間の見た目上の問題と考えることができる。これは「アドホックなポリモーフィズム」と呼ばれる。