• ベストアンサー

Observerインターフェイスについて

Javaを勉強中の者です。宜しくお願いします。 JavaのAPIの中で、Observerはインタフェースとなっています。Observerが普通のクラスではなくてインターフェイスとなっているのはなぜなのでしょうか? インターフェイスだと、複数の継承が可能になるからでしょうか?でももしそうなら、あるクラスAがObserverだけを継承している場合は、複数継承ではないので、Observerをインターフェイスにする必要がなくなりますよね。。という事は、他にもこのObserverをインターフェイスにする利点(理由)があるのでしょうか? どなたかご教授をお願いします。 Observerについては、下記のサイトを参考にしました(http://www.fuka.info.waseda.ac.jp/~washi/m_html/node12.html#observer

  • Java
  • 回答数2
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.1

>あるクラスAがObserverだけを継承している場合は、複数継承ではないので、 >Observerをインターフェイスにする必要がなくなりますよね。 と言いますが、 あるクラスがObserverの他にも継承するものがあった場合、 Observerがインタフェースでないと困りますよね。 Observerがクラスでなくてインタフェースである理由は、 「クラスにする必要がないから」 です。 オブジェクト指向言語での「継承」の取り扱いは、 C++のころとはずいぶん変わりました。 C++のころは、なんでもかんでも「クラスの継承」だったのですが、 継承の危険性が認識されてきて、 「クラスの継承は、なるべく行わない方がよい」 と考えられるようになってきたのです。 インタフェースの継承(実装。implements)は、 クラスの継承よりは危険性は少ないです。 現在、 「インタフェースにできるものは、なるべくインタフェースにする」 という考えが主流になっています。 本当はObservableの方もインタフェースにしたかったはずなんですよ。 ですが「Observerの保持/通知」などの実装が必要になるので、 仕方なくクラスになっているわけです。

meteors
質問者

お礼

>「インタフェースにできるものは、なるべくインタフェースにする」 そうだったんですね!大変勉強になりました。ありがとうございました。

その他の回答 (1)

noname#49664
noname#49664
回答No.2

これはデザインパターンの話ですからJavaそのものとは直接関係ないとは思いますが・・・。Javaの実装を想定しての話に限定して。 >あるクラスAがObserverだけを継承している場合  実質問題として、Observerを利用するクラスがObserver以外を一切継承しない(つまりObject継承)クラスということはあまり想像できないんじゃないでしょうか。Observerはコンポーネント間で状態更新を検知するものですから、コンポーネントとしての何の実装も継承していないクラスで利用するのは圧倒的にレアなケースでしょう。  そもそもインターフェイスは、単に「多重継承の代用」とかいうことだけでなく、「依存性を排除する」ということもあります。これは、質問者さんが参考にされたページにも書いてありますね。より柔軟なコンポーネントの利用を考えるなら、いかにしてコンポーネント間の依存性を取り除くかは重要でしょう。ならばインターフェイスにしたほうが依存性を低くすることができます。

meteors
質問者

お礼

なるほど!依存性の排除もインターフェイスの重要な役割ですね。ありがとうございました。

関連するQ&A

  • observerパターンについて。

    observerパターンについて勉強中です。下のサイトを参考にしています http://www.fuka.info.waseda.ac.jp/~washi/m_html/node12.html もしVectorを使って、データを挿入し(更新し)、それをobserverに通知したいという場合はたとえばどのようにconcreteSubjectクラスはかけるのでしょうか。 subjectStateを訳すとデータの状態?なので、subjectStateを具体的にデータを保持するVectorオブジェクトの参照変数とするのべきなのでしょうか? http://www.hellohiro.com/pattern/observer.htm こちらのサイトでは型がStringで、"NEW"といったような文字をセットしたりしていますが、そういうデータの状態を表す指標(Vectorなら要素数とか?)をsbjectStateに入れておくべきで、データ本体は別のフィールドとして持たせるということなのでしょうか・・・? 自分で言っていてもなんかあほらしい質問なのですが、どうもこのクラス図の見方になれていないので、アドバイスをいただければと思います。

    • ベストアンサー
    • Java
  • インターフェイスは何故必要か

     Javaの初心者です、宜しくお願いします。  Javaには継承という仕組みがあるのに何故インターフェイスという 仕組みが必要なのでしょうか。  勿論、2個の親クラスからの継承を嫌ったのはなんとなく理解出来るのですが それなら子クラスでインターフェイスの機能を別途作ってやれば、わざわざイン ターフェイスという仕組みを考える必要がないと思うのですが。  親クラス、子、孫、またその孫としてやり、そのどれかのクラスに インターフェイスの機能を持たせれば良いだけと考えるのですが。  インターフェイスのメッソドを全て実装する必要とかもなくなると思うのですが。  以上宜しくお願いします。

    • ベストアンサー
    • Java
  • インターフェースの利点は?

    Javaを勉強しております。 インターフェースの使い方を知ったのですが、その利点がわかりません。 インターフェースの記述の仕方はクラスによく似ていますが、インターフェースでできること(フィールドやメソッドを書く)はクラスでもできると思います。 インターフェースでしかできないことはあるのでしょうか? インターフェースはどのような場面で活用するのが有効なのでしょうか?

  • interface

    javaを勉強中ですが、interfaceで分からなくなっています。 いったいこれは、どのような状況でつかうのでしょうか。 どういった利点があるのか分かりません。 interfaceを宣言しないで必要なときに実装するのではなにか不都合があるのでしょうか。 よろしくご教授下さい。

    • ベストアンサー
    • Java
  • Java - インターフェース

    Java初心者です。 インターフェースの勉強中なのですが、いまいちインターフェースの利点、意味が良くわかりません。1つのクラスに複数のインターフェースが使えるとのことですが、普通にクラスに組み込んではダメなのでしょうか? わかりやすく説明してもらえると助かります。

  • インターフェースってズバリ何なんでしょうか?

    最近DirectX9をやってます。 始める→挫折→C++をもう一度勉強→また始める という状況で、だいたいのことは分かってきたのですが、 IDirect3D9というのがいまいち分かりません。 インターフェースというのは私の中では、「関数をたくさん定義して、継承させるためのもの」という適当な認識をしているのですが、 IDirect3D9インターフェースは、インスタンス化されていますし、これを継承したクラスは使いませんし、普通にメンバ関数を扱っています。 いったい、インターフェースとは何なのでしょうか? また、IDirect3D9インターフェースは、何故インターフェース何でしょうか? 是非ご教授ください。

  • インタフェース、クラスの継承、コンストラクタ意味

    Javaを学習している初心者です。 インタフェース、コンストラクタ、クラスの継承について、 必要な理由が、イマイチよく分かりません。 特に設定しなくても、プログラムは動くと思うのですが・・・ (特にインタフェース) 詳しい方、教えて下さい。

    • ベストアンサー
    • Java
  • なぜインタフェースを使うのか?

    カテゴリはJavaですが、オブジェクト指向という観点での質問です。 私はオブジェクト指向を勉強中です。(C#) そこで、疑問に思ったのがタイトルで示したインタフェースについてです。 以下に疑問を列挙します。 1.インタフェースはなぜ使うのですか? 2.使うメリットはなんですか? 3.インタフェースのインスタンスって作れるのですか? 4.インタフェースは必ずどこかのクラスに継承されないといけないのですか?  単体では何もできないのですか? 5.具体的な使い方を教えてください。 全部でなくてもよいのでわかる方ご教授よろしくお願いいたします。

    • ベストアンサー
    • Java
  • インターフェースの使い方。

    javaを勉強している者です。あるコードを読んでいるのですが、そのなかでインターフェースで宣言しているインターフェース(日本語変な気がしますが)を別のクラスで、クラスみたいに宣言しているようなコードがあるのですが、それは文法的に大丈夫なのでしょうか?具体的には public interface MailStore{//いくつかのメソッドなど} というのがMailStore.javaで書かれていて別のMain.javaというコードの中で priate static MailStore _mailStore; public static MailStore getMailStore(){return _mailStore;} という2行がこの中で書かれています。 よろしくお願いします。 (ちなみにコードは「EclipseによるJava実用プログラミング」という本によるものです。下記のURLからダウンロード可能で、mailというディレクトリの中のコードです) https://products.locus.co.jp/index.php3​

    • ベストアンサー
    • Java
  • インターフェースについて

    いまサーブレットをやっています。 Java言語仕様では、 「インターフェースの定義には、メソッドの定義を書いてはいけない」 (メソッドの定義はそのインターフェースをimplementsしたクラスのなかで オーバーライドする) ということになってますよね? …でも、 APIリファレンスを読むと、 インターフェースHttpServletRequestのメソッドgetParameterには、 「リクエストパラメータの値をString型として返す」と書かれています。 ↑これって上記のJava言語仕様と矛盾してませんか? まるでどこかでgetParameterメソッドの定義がなされているかのようです。 これってどういうことでしょう? 考えれば考えるほど、訳わかりません。とっても混乱中です(-_-)

    • ベストアンサー
    • Java

専門家に質問してみよう