ポリモルフィズム

2007/03/30 (Fri) 22:07:46 JST

前回は配列に簡単なメッセージを送ってみました。今回はいろいろな方法でメッセージを送ってみましょう。

異なるオブジェクトに同じメッセージを送る

お次は文字列に同じメッセージ (at:) を送ってみましょう。ワークスぺースで次の式を書き、「式を表示」してください。

'hello' at: 1

今度は $h と表示されます。これは文字hを表すオブジェクトです。文字列に対して at: を送ると、n番目の文字が返ってきます。

文字列は配列とどう違うのか、文字列を選択してインスペクトしてみましょう。

配列と同じように、左上のインスタンス変数の欄に番号が並んでいます。この番号を選択すると数値が右上に表示されます。

これは文字列の各文字の内容です。さっきは at: で最初の文字を取得しましたが、インスペクタで中身を見ると1番目の要素には単なる数値が入っています。ワークスぺースで文字 $h をインスペクトして確認してみましょう。

文字 $h のインスタンス変数 value には今の文字列で確認した数値が入っています。このことから文字列の内部は数値で管理しておき、at: メッセージが送られると数値を文字に変換して返すことがわかります。

今度は文字列のインスペクタで、配列と同じように at:put: メッセージを送ってみましょう。

self at: 1 put: $a

先頭の文字が $a に対応する数値に変わります。

メッセージとメソッド

前回、オブジェクトは「メソッド」を使って自分自身を操作すると書きました。さらに文字列と配列に同じメッセージを送ってみると、同じ操作を行うことができることがわかりました。では今回送ったメッセージに対応する「メソッド」は、オブジェクトが文字列か配列を判断して処理を行っているのでしょうか。

実は、オブジェクトは自分専用の「メソッド」を持っています。文字列にも配列にも at:put: に対応するメソッドはありますが、文字列の at:put: メソッドは文字列専用、配列の at:put: メソッドは配列専用です。

メソッドは「ブラウザ」で見ることができます。ブラウザを表示するには「開く」メニューから「ブラウザ」を選択します。

左端のウィンドウでお決まりのaltキー + 左クリックをするとメニューが表示されるので、そこから "find class..." を選択します。

すると次のようなパネルが表示されるので、ここに "String" と入力して「了解」をクリックします。

ずらっと表示されたリストの中から "String" を選択します。

これでブラウザの上のウィンドウの空欄が埋まります。中央右のウィンドウから "accessing" を選択し、続けて右端のウィンドウの "at:put:" を選択してください。

これが at:put: を送ると実行される文字列のメソッドです。まだメソッドの内容はわからなくても構いません。

今度は配列専用の at:put: メソッドを調べてみましょう。文字列と同様に "find class..." から "Object" を検索し、同じく中央右のウィンドウから "accessing" 、続けて "at:put:" を選択してください。「配列なのにObject?」と気づいためざといアナタ、余計な詮索はしないのが大人の態度です。

こちらは配列専用の at:put: メソッドです。同じメッセージを受け取っても、対応するメソッドはそれぞれ異なります。

関数とメソッド

関数でもデータ型に応じていくつか用意することがあります。例えば文字列・配列の各要素にアクセスする関数なら

のように、関数名を見てどのデータ型を扱えるのかがわかるようにすると思います。メッセージ送信はこの方法よりも多少簡単に書けます。オブジェクトは自分専用のメソッドを持っていますから、_stringや_arrayのようにデータ型を指定する必要はありません。

オブジェクト指向プログラミングには、このような構造的な使いやすさもあります。メッセージ送信を行わない言語でもこのメリットは変わりません。

ポリモルフィズム

前回と今回で、文字列と配列にそれぞれ同じメッセージを送ってみました。at:put: を送ると、文字列ならn番目の文字が、配列ならn番目の要素が返ってきます。このように、オブジェクトによっては同じメッセージを送っても挙動が異なります。

この性質を「ポリモルフィズム」と言うのですが、ポリモルフィズムとはまた聞き慣れない舌を噛みそうな用語です。日本語では「多様性」とか「多態性」などと訳されていますが、これだって何のことやらさっぱりです。

ポリモルフィズムはもともと化学用語で「化学組成が同じでも結晶の形が異なるもの」のことを指します。例えば同じ炭素からできる結晶でも、条件によっては黒鉛になり、ダイヤモンドになります。これに見立てて「メッセージが同じでもオブジェクトによって実行結果が異なる」ことをポリモルフィズムと呼ぶことにしたのでしょう。しかし、この用語はめったに使うことはないので忘れても構いません。

まとめ

クラスとメソッドに続きます。


Inverse Pages: メッセージ送信 Squeakによるオブジェクト指向プログラミング入門