ポリモフィズム

インタフェースと抽象クラスの違いの続きです。誰に見せるという目的があるわけではなく、自分の考えを整理するために書いています。

馬というクラスと車というクラスがあります。どちらもrun()というメソッドを持っています。同じrun()を呼び出すにしても、メソッドを呼び出されたオブジェクトの側では、やることが全然違います。

  • 馬: 足の筋肉を動かす。
  • 車: エンジンの動力を使って車輪を回転させる。

オブジェクトのカプセル化とは、たとえば馬のインスタンスを例にとれば、run()が起動されたとき、馬の体内でどのような過程を経て筋肉を動かすかを隠すことです。脳から指令を出し、肺を使って呼吸をし、血液を循環させる。このような過程は馬の背にのっている人間にとってはどうでもよいことです。車についても同様。

馬と車に対して同じrun()という操作ができる。そのためには、run()という操作と、操作の実体(馬の筋肉)が切り離されている必要があります。これが型と実装の違いです。型と実装が切り離されているからこそ、馬に乗る人は馬の体内の赤血球の数を気にしなくて済むのです。

Javaではインタフェースで実装を持たない型を、クラスで実装を持った型を表現できます。インタフェースではrun()を定義し、クラスではインタフェースの実装を定義します。馬と車が同じインタフェース(型)を実装することで、実装のまったく異なる馬と車に対して同じ操作をすることができます。

オブジェクト指向では、メソッド呼び出しのことをメッセージを送信するという言い方をします。馬と車のように、同じメッセージが受け手によって別々の振る舞いになる。これがポリモフィズムです。Javaでは、インタフェースによって型階層を、クラスによって実装の階層を表現できるので、馬と車という一見実装上関係の無いインスタンス間でポリモフィックな操作ができるのです。