ポリモーフィズム

周りでポリモーフィズムってなに?という話になったんですが、何がポリモーフィズムなのか人によってだいぶ認識が異なるようです。そこで、どんなポリモーフィズムがあるのか調べてみました。

大雑把に言って、ポリモーフィズムという言葉は三つの使われ方があるようです。
(1)同じメッセージに対して異なるオブジェクトが異なる振る舞いをすること
http://www.ogis-ri.co.jp/otc/hiroba/technical/OO_Guide/O2.html
オブジェクト指向の世界では、オブジェクト同士がメッセージをやり取りします。メッセージを受け取ったオブジェクトは、それに対して様々な仕事をします。どのような仕事をするかはオブジェクト次第です。たとえば、飛行機オブジェクトに move() というメッセージを送れば飛ぶでしょうが、同じメッセージをイルカオブジェクトに送った場合は泳ぐでしょう。
このような仕組みは、JavaC++では継承とメソッドのオーバーライドによって実現できます。

(2)変数が一つ以上のクラスのオブジェクトを参照できること。
バートランド・メイヤーの『オブジェクト指向入門』では、ポリモーフィズムと動的束縛を次のように定義しています。
「プログラムエンティティは一つ以上のクラスのオブジェクトを参照できなければならない。そして、操作は異なるクラスについては異なる方法で実現できなければならない」プログラムエンティティとは、変数のことで、あるオブジェクトを指し示します。つまり、ここでは、変数が特定のクラスのオブジェクトだけではなく複数のオブジェクトを参照できることがポリモーフィズムだ、というわけです。C++Javaでは、Class Aのオブジェクトを指す変数は Class Aのサブクラスのオブジェクトも指すことができます。後半の動的束縛についての記述は、ほぼ(1)と同じ意味です。

(3) Cardelli と Wegnerのポリモーフィズム(図2:CardelliとWegnerによる多態の分類参照)
これは(1)を含んだより広い概念です。継承によるポリモーフィズムの他にジェネリックやオーバーローディング、キャスティングによるポリモーフィズムがあります。これらはいずれも、型ごとの振る舞いやアルゴリズムの違いを隠蔽します。つまり、オブジェクトを使った何らかの操作(たとえばメッセージ送信や関数の引数にオブジェクトを渡すなど)を行った結果は、オブジェクト次第で異なります。

まとめると、以下のようになります。
(1)は、オブジェクトに送ったメッセージがオブジェクト次第で「様々な振る舞い」を起こすことをポリモーフィズムと呼ぶ。
(2)は変数が「様々な型」のオブジェクトを参照することをポリモーフィズムと呼ぶ
(3)はオブジェクトを使った操作がオブジェクト次第で「様々な結果」を起こすことをポリモーフィズムと呼ぶ。

#(1)や(2)は大体理解しているつもりですが、(3)は今回はじめて知ったので間違いも多そう。。

ポリモーフィズムという言葉は、結構、特殊な用語で限定された使われ方しかされていないと思っていたけど、こうして改めて考えてみるとずいぶん違う意味があるのに驚いた。さらにわからないのは、アーキテクチャSOAWeb 2.0なわけなんですが。。