Java の interface と Objective-C の protocol
Java の interface というと、C++ の 多重継承の問題を鮮やかに解決!..なんて話を思い出します。
* * *
多重継承の問題は、ざっくばらんにまとめると、一つのインターフェイスに対する複数の実装をクラスが持ってしまうケースがあるということです。一つの実装に対するルートが複数有る場合もあります。これらは 実装継承と型継承(インターフェイス継承)を同時に行ってしまうことの弊害です。だから、実装継承と型継承を同時に行う「クラスの継承」は単一継承に限り、多重継承は型継承にのみ許すというのは自然な解決策です。
Java の interface の目的としてかつて良くこれを聞きました。 Objective-C の protocol が元ネタだ、と言う話は、実はこっち側じゃないのかな、と思っています。Objective-C は単一継承な言語で、でも protocol を持っています。「多重継承はいいことないよ。それよりも、protocol を採用(adopt)して、実装は委譲とかで処理しなさいな。ソッチの方がスマートだよ」な話を Objective-C なドキュメントで見たりするのですが、なんかこれって、どっかで聞いたことあるような(w
* * *
実は以前、Objective-C の勉強をしたとき、protocol ってなんだか良く解らなかったんです。言ってることは解るような、でもなんだか掴み所が無くてモヤモヤしてしまっていて。で、そのままサラっと流してしまっていて、解らないまま今に至ると(^^;
だから、2007-12-02 さんとか http://d.hatena.ne.jp/t_yano/20071202 さんとかは、個人的にはとても嬉しいエントリ。ありがとうございます。
一方で、「Java の interface って何?」って話も、実は良く解りません(ぉ。話を聞く度に、最初のエントリような 「インターフェイスという概念を具現化したものだ」みたいな方にウェイトを乗せた話と、このエントリのような 「多重継承に対するスマートな解決策」にウェイトを乗せた話と、両方の話が出るからです。(で、前側の話をしたほうが OO屋さんとしては格好良さそうな雰囲気が醸し出せるかな、という印象があったりとかw)
ここら辺は ある機能とその効能というか、複数の側面というだけだと思うのだけれど、「多重継承いくない!」にウェイトを置いた説明を見る限り、Java も Objective-C もまったく同じ事を言っているように見えます。
ここら辺の歴史(?)って、よくわかんないのですよね。