- ベストアンサー
Observerインターフェイスについて
Javaを勉強中の者です。宜しくお願いします。 JavaのAPIの中で、Observerはインタフェースとなっています。Observerが普通のクラスではなくてインターフェイスとなっているのはなぜなのでしょうか? インターフェイスだと、複数の継承が可能になるからでしょうか?でももしそうなら、あるクラスAがObserverだけを継承している場合は、複数継承ではないので、Observerをインターフェイスにする必要がなくなりますよね。。という事は、他にもこのObserverをインターフェイスにする利点(理由)があるのでしょうか? どなたかご教授をお願いします。 Observerについては、下記のサイトを参考にしました(http://www.fuka.info.waseda.ac.jp/~washi/m_html/node12.html#observer)
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
>あるクラスAがObserverだけを継承している場合は、複数継承ではないので、 >Observerをインターフェイスにする必要がなくなりますよね。 と言いますが、 あるクラスがObserverの他にも継承するものがあった場合、 Observerがインタフェースでないと困りますよね。 Observerがクラスでなくてインタフェースである理由は、 「クラスにする必要がないから」 です。 オブジェクト指向言語での「継承」の取り扱いは、 C++のころとはずいぶん変わりました。 C++のころは、なんでもかんでも「クラスの継承」だったのですが、 継承の危険性が認識されてきて、 「クラスの継承は、なるべく行わない方がよい」 と考えられるようになってきたのです。 インタフェースの継承(実装。implements)は、 クラスの継承よりは危険性は少ないです。 現在、 「インタフェースにできるものは、なるべくインタフェースにする」 という考えが主流になっています。 本当はObservableの方もインタフェースにしたかったはずなんですよ。 ですが「Observerの保持/通知」などの実装が必要になるので、 仕方なくクラスになっているわけです。
その他の回答 (1)
これはデザインパターンの話ですからJavaそのものとは直接関係ないとは思いますが・・・。Javaの実装を想定しての話に限定して。 >あるクラスAがObserverだけを継承している場合 実質問題として、Observerを利用するクラスがObserver以外を一切継承しない(つまりObject継承)クラスということはあまり想像できないんじゃないでしょうか。Observerはコンポーネント間で状態更新を検知するものですから、コンポーネントとしての何の実装も継承していないクラスで利用するのは圧倒的にレアなケースでしょう。 そもそもインターフェイスは、単に「多重継承の代用」とかいうことだけでなく、「依存性を排除する」ということもあります。これは、質問者さんが参考にされたページにも書いてありますね。より柔軟なコンポーネントの利用を考えるなら、いかにしてコンポーネント間の依存性を取り除くかは重要でしょう。ならばインターフェイスにしたほうが依存性を低くすることができます。
お礼
なるほど!依存性の排除もインターフェイスの重要な役割ですね。ありがとうございました。
お礼
>「インタフェースにできるものは、なるべくインタフェースにする」 そうだったんですね!大変勉強になりました。ありがとうございました。