あどけない話

インターネットに関する技術的な話など

オブジェクト指向再入門

C は知っているけれど、Javaオブジェクト指向に挫折した人は、今すぐオブジェクト指向再入門を読みましょう。みんな初めからこう説明してくれればよかったのにと思います。

面白いと感じた人は、今すぐ「Java謎+落とし穴徹底解明」を買いましょう!

Java 謎+落とし穴 徹底解明 (標準プログラマーズライブラリ)

Java 謎+落とし穴 徹底解明 (標準プログラマーズライブラリ)

関数呼び出しとメッセージ

ところで、皆様からのご意見(1)にあるboard_put(board, x, y) と board.put(x, y) の違いの議論ですが、「継承を考えない限りにおいては」という条件ではダメだそうです。

前橋さんは関数名と関数の実体を一対一に対応させるためにこの条件にしたのだと思いますが、小田ちゃん曰く、「クラスを1つに限れば」と書かなければいけないそうです。なぜなら、Java なら interface でも多態性が実現できるからです。

たとえば、以下の例を考えて下さい。

interface I { put() }
class A implements I { ... }
class B implements I { ... }

型 I に対して、put を呼ぶ場合、class A の put か class B の put か分りません。なので、クラスを1つに制限しないといけないようです。

イメージが掴めた後は

前橋さんのページでオブジェクト指向のイメージが掴めた後は、Java 風の継承や interface、あるいは動的にオブジェクトにメソッドを追加できる JavaScript 風のオブジェクト指向のことも考えて、やはり put は「セレクタ」だと考えるのがよいようです。

インターフェイス

オブジェクト指向では、「インターフェイスに対してプログラミングするのであって、実装に対してプログラミングするのではない」という言葉をよく耳にします。(インターフェイスとは、公開されたメソッドのことです。API と思ってもいいです。)

これは、内部をカプセル化することだとばかり思っていました。しかし、オブジェクトにメッセージを投げることで、そのオブジェクトに仕事をさせるという意味もあるのかなぁと最近は思い始めています。