• 締切済み

メソッドの戻り値をインターフェースとする利点ってなんでしょうか?

メソッドの戻り値をインターフェースとする利点ってなんでしょうか? サードパーティ製のライブラリなどでよく見かけますが 具体的にどういう利点があるのでしょうか?

みんなの回答

  • OKbokuzyo
  • ベストアンサー率43% (130/296)
回答No.2

サードパーティ製とおっしゃられているものがなんなのかわからないので はっきりとしたことは言えませんが メソッドの戻り値の型をインターフェースとする理由は 下記のようなパターンが考えられます。 1.Abstract Factoryパターンを想定されたFactoryクラスである。 2.利用者にnewしてほしくないクラスである。 1.はAbstract Factoryで調べればいくらでもひっかかるのでご自身で調べてください。 一般的にAbstract Factoryは抽象クラスで解説されていますが 考え方さえわかればインターフェースを戻り値にしても 同等のことができることがわかるはずです。 2.はインターフェースを実装したprivateなインナークラスの オブジェクトを返すことによって 利用者にnewされることなく、オブジェクトのみ渡すという手法です。 こうするとキャストされることもありません。 ただし、普通はSingletonパターンを用いたり staticで済ましたりすることが多いので 普通はあまり使われることはないと思います。 そもそもnewさせたくない理由としては 1.オブジェクトが重いので乱立させたくない。 2.コンストラクタの処理に時間がかかる。 3.その他、排他等のため などの理由があり、あらかじめシステムでプールしておいて 利用者には貸し出すという形をとりたい場合が考えられます。 2のパターンは比較的大きなシステムじゃない限り 滅多利用することはないと思いますが その場合はライブラリというより どちらかというとフレームワークであることの方が多いと思います。 (まぁ、いずれにしても実態はjarですけど)

全文を見る
すると、全ての回答が全文表示されます。
  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.1

インターフェースが同じならどこにでも使いまわせるでしょ? 身近なもので例を挙げるわね。 パソコンのUSB機器。 実に多種さまざまあるわね。 でもパソコンとのインターフェースをUSBインターフェースに共通化することで USBを差し込めるパソコンなら誰でもそのUSB機器を利用することができるわ。 インターフェースの共通化というのはすごくメリットの大きいことなのよ。 また、もうひとつの理由もあるわ。 実装クラスには多種さまざまなメソッドが用意されている でも、中には利用されたくないメソッドもあったりする。 そんなときは、限定されたメソッドだけをインターフェースとして公開するのよ。 もちろん直接キャストとかしちゃえば使えちゃうけど、 それは作り手の期待していない使い方だわ。 作り手が使ってほしい機能だけを公開する。 そのためのインターフェースよ。

kyonn2008
質問者

お礼

私の質問の仕方がいけないのか 回答として的を得ていないようにお見受けします。 わざわざご回答ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • インターフェースの利点は?

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

  • 戻り値のないメソッド

    戻り値のないメソッドって意味あるんですか? 例えばどういうときに有効なのでしょうか?

    • ベストアンサー
    • Java
  • メソッドは戻り値はなし プロパティは戻り値を返す?

    オブジェクトブラウザを見てもよくわからなかったのですが メソッドは戻り値はなしで、 プロパティは戻り値を返す、 と言う認識で合ってますか?

  • 戻り値の異なるメソッドの多重定義はできないのですか?

     戻り値の異なるメソッドの多重定義はできないものでしょうか?  例えば、Integer型の戻り値を持つメソッドHogeを持つクラスClass1があるとします。 public Class1{ ・・・  public Integer Hoge(){ ・・・ }     ・・・ } これを継承したクラスClass2を作ります。 public Class2 extend Class1{ ・・・ public int Hoge(){ Integer buf = this.Hoge(); int buf2 = buf.intvalue(); }   ・・・ }  私の環境ではエラーとなって実行できませんでしたが、 こういったことはできないものなのでしょうか?  やりたいことは、(Javaのライブラリに含まれている)Integer型を持つメソッドを他のクラスから使用できるようにするためにint型に変換することなんですが、他のクラスの変更は一切しないで、この部分を書き換える(アダプタパターンを使う)ことによって実現したいと考えています。  他に良い方法はあるでしょうか?宜しければ、アドバイスお願いします。  

    • ベストアンサー
    • Java
  • インターフェース型の使い方がわかりません。

    ライブラリにあるメソッドはcopy()で コピー処理があるクラスに飛んで、コピーして戻ってくるのはわかりますが、 インターフェース型の使い方がさっぱりわかりません。 簡単にインターフェース型とはどういうものか教えてください。

  • メソッドの引数に指定されているインタフェースについて

    最近サーブレットをいじっているので例としてサーブレットを扱いますが、一般的な話題として扱っていただければと存じます。 非常に質問を文章化しにくいのですが・・ たとえば、クラスHttpServletには以下のようなメソッドがあります。 doGet(HttpServletRequest req, HttpServletResponse resp) このメソッドの引数に指定されているHttpServletRequest/Responseはいずれもインタフェースなわけですが、メソッドの引数にインタフェースを指定するというのは、具体的にどういうことなのでしょうか? これがたとえばintだったりStringだったりした場合は簡単にイメージできるのですが、インタフェースだとさっぱりわかりません。 質問がわかりにくいかもしれませんが、よろしくお願いいたします。

    • ベストアンサー
    • Java
  • メソッドの戻り値がnull

    現在システム開発中です。 true,falseを返すメソッドを改修して、3つの状態を返すようにしたいです。そこでnullも返すようにしたいのですが、戻り値にnullは良くないのでしょうか。理由も教えて頂けると幸いです。

  • __interfaceに定義するメソッドについて教えてください!

    __interfaceに定義するメソッドについて教えてください! 描画エンジン(engine.dll)を作成しているのですが、アプリ(App.exe)からは呼んで欲しくないメソッドをインターフェイスに定義する必要があり困っています。具体的には、以下のDrawメソッドになります。 // 形状インターフェイス[engine.dll] __interface IShape { bool Draw(); // ★CRenderクラスから呼ばれる bool SetPos( int x, int y ); }; // 描画クラス[engine.dll] class CRender { bool DrawShape( IShape* pShape ); // pShape->Draw();をする }; // アプリ[App.exe] CRender* pRender = new CRender(); IShape* pShape = new CPolygon(); pShape->SetPos(100, 100); pRender->DrawShape( pShape ); DrawメソッドはCRenderが呼ぶメソッドなので、アプリには公開しなくてもよいメソッドになっています。公開する必要がないので、隠蔽するのが正しいと思っていますが、良い案がございましたらご助言ください。

  • インターフェイスと抽象メソッドについてお願いします。

    PHPの参考書で「抽象メソッド」と「インターフェイス」それに「実装」という言葉が出てきました。 プログラミングが初めてで全然理解できなく困っています。 ・抽象メソッド ・インターフェイス ・実装 上記の意味とメリットなどを教えてください。それとどのような面で使うのかも教えていただけると嬉しいです。 すみませんが、よろしくお願いします。

    • ベストアンサー
    • PHP
  • ExecuteNonQueryメソッドの戻り値

    C#.Netを使用して、Webアプリケーションを作成しており、その中でExecuteNonQueryメソッドを使用してストアドを実行しています。 そのストアド内では、さらに別のストアド(それぞれUpdate処理を実行)を2回~5回実行しています。 このときのExecuteNonQueryの戻り値は、Update処理が行われた回数(実際に更新されたレコード件数ではない)になります。ストアド内でエラーが発生した場合は、戻り値を返さずにエラーで終了します。 しかし稀にですが、戻り値が「0」になることがあります。 行われるはずのUpdate処理は行われず、かといってエラーでもない。というのでしょうか?原因が分からずに困っています。 どのような状況の場合に戻り値が「0」になるのか、ご存知の方教えてください。

このQ&Aのポイント
  • Wi-Fiがつながらない時の対処法やトラブルシューティングについて解説します。
  • Wi-Fi接続トラブルの解決方法や原因、よくある問題点について詳しく説明します。
  • Wi-Fiがつながらない場合のチェックポイントや設定の確認方法についてまとめました。
回答を見る