• ベストアンサー

オブジェクト指向のインターフェースについて質問です

素朴な疑問かもしれませんが、真剣に根本的な疑問です よろしくお願いします 複数人でなく、一人でプログラムを作るときには インターフェースにはどんな使い方がありますか? 多人数でプログラムを作る場合にはクラスを作る人たちへの どんなクラスを作って欲しいかの設計メモ代わりになったり 必要なメソッドの作り漏れ防止の意味で使われると聞きました。 しかし、一人でプログラムを作る場合には わざわざインターフェースを作ってからそれを実装するのは どのような意味があるのでしょうか?

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

  • ベストアンサー
  • shiren2
  • ベストアンサー率47% (139/295)
回答No.4

明けましておめでとうございます。 >一人でプログラムを作る場合には 他の方も仰っていますが、オブジェクト指向は分析や設計で使うものです。 オブジェクト指向を使って分析や設計を行うなら、インターフェースも使われることがあります。 例えばJohnの親がPersonで、PersonとBirdがISpeakを実装する、といった感じです。 抽象クラスは主に概念上の親子関係を示し、インターフェースは主に機能上の共通性を示します。 こういった、抽象的な関係性の中でクラスやインターフェースは定義されているのであって、実装上の理由から定義されるわけではないですよ。 個人でも、きっちり設計したなら、インターフェースを使う機会も多いはずです。 それがオブジェクト指向ということであって、ただ動けばいいとか、便利とか、そういうものではないです。

utawoutau
質問者

お礼

実装のときの実用性で作られるわけではないというので なるほどと思いました ありがとうございました

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

その他の回答 (5)

回答No.6

インターフェースの利用法は大きく2種類あります。 (1) 共通のインターフェースを定義する。 オブジェクト指向で設計を行うとき、複数のクラスでグループを 作り、共通のメソッドを定義してクラスを実装するということを よくやります、これはとてもよく行う基本的な設計作業です。 この共通メソッドの定義は ■ インターフェース ■ 抽象クラス のどちらでも行うことができます。 インターフェースは全く実装を持たない抽象クラスと言えます。 既定の実装は不要ならインターフェースで定義したほうが若干楽です。 共通のインターフェースだけを利用して処理を行うコード部分は オブジェクトをインターフェースや抽象クラスとしてアクセスするように書くと クラスのグループに新しいメンバ(クラス)が加わっても、コードの書き換えが ほとんど発生しません。 (2) オブジェクトに多面性をもたせる。 ひとつのオブジェクトが2つのグループに属し、使う場面によって異なる顔を 持つことがあります。 例えば「部長」オブジェクトは「従業員」としてのメソッドと 「管理者」としてのメソッドを持つとしましょう。 部長を「従業員」として処理するコードと、「管理者」として 処理するコードの両方に渡したい場合、部長はある時は 「従業員」に見え、ある時は「管理者」に見えることが必要ですが、 「従業員」や「管理者」を抽象クラスを使って 定義することはできません(子に継承できる親クラスはひとつ)。 この場合はインターフェースで「従業員」や「管理者」を定義して 多重継承します。するといつでも「従業員」や「管理者」に キャストできるようになります。

utawoutau
質問者

お礼

なんとなく理解できました 実装上でもそのようなメリットもあるのですね しかし、この理由でも実装上のメリットだけでなく設計上のメリットも 含まれてるようにも感じますし、インターフェースは 設計的に大きな意味があるのかと感じました 勉強になりました ありがとうございました

全文を見る
すると、全ての回答が全文表示されます。
  • shiren2
  • ベストアンサー率47% (139/295)
回答No.5

ANo.4の補足です。 >実装上の理由から定義されるわけではない この表現は分かりにくかったかもしれません。 実装段階の都合で使われるわけではない、と読み替えてください。 辞書的な意味での実装ではなく、段階としての実装段階のことです。

全文を見る
すると、全ての回答が全文表示されます。
  • Interest
  • ベストアンサー率31% (207/659)
回答No.3

インタフェースと実装を分離しておくと、実装側が変わってもそのクラスを利用する側からみたら同じように見えるので、利用する側のクラスを変更しなくて済むというメリットがあります。 例として、プリンタを制御するクラスを作る事を考えてみましょう。インタフェースとしてプリンタクラスを用意しておき、実装はインクジェットプリンタクラスとレーザープリンタクラスで作り分けるようにすれば、プリンタクラスを利用する側は実装がどうなっているかは知らなくても、とにかくインタフェースさえ知っていればプリンタを使えるわけです。品質特性で言えば、インタフェースと実装を分けることにより、拡張性や移植性が高まるわけです。 他人の手に渡ることのないプログラムや使い捨てられるプログラムであれば、このような品質要求はおそらくないと思いますので、インタフェースと実装を分離するメリットはそれほどないかもしれません。 「そんなのオブジェクト指向の基本じゃないか!」と言われるとそのとおりで、じゃあインタフェース(interface)と抽象クラス(abstract)の違いって何、というのが次に湧いてくる疑問じゃないかと思います。

utawoutau
質問者

お礼

ありがとうございます これらの理由だと自分ひとりでやる場合には あまり問題がないのではと思いましたが、 多人数でやる場合にはこれらのメリットも生かされそうですね

全文を見る
すると、全ての回答が全文表示されます。
  • LancerVII
  • ベストアンサー率51% (1060/2054)
回答No.2

こんにちは。 個人的には間違い防止でインターフェースを作るという考えはありません。 会社内でのプロジェクトでもうちの職場はそういった概念がありませんでした。 DAOの例では間違えの予防というよりはデータベースが変わった時に実際のDAOを変更しても再利用が簡単ということです。 現在のバージョンならGenericsが使えて、基本的にキャストミス等はおきづらくなりましたし、JavaDocをみつに作るようにして対応しています。

utawoutau
質問者

お礼

追回答ありがとうございます 再利用性についても勉強してみて たしかにそういうのがあるかもしれないと思いました ありがとうございました

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

こんにちは。 一人で作るとか複数人で作るとかではなく、単純にそういうクラス設計にしたい時にインターフェースを使います。 例えばDAOクラスにインターフェースを用意しておけば必ずもらいたいデータはそのクラスになります。 するとDAOクラスを呼び出しているクラスの変更がいらなかったり。 なんていうか言葉で表すのは難しいのですが、システム内の設計で必要になったら使う感じです。

utawoutau
質問者

補足

ありがとうございます すみません、例をあげて詳しく書けばよかったかもしれませんでした 説明不足でした たとえばそのDAOクラスのメソッドを呼び出すとき、 インターフェースを用意しておけば「必ず」目的の型になりますが 「必ず」というのは「間違った渡し方や使い方をする可能性」が あるのを予防するためだと思ったのですが、どうでしょうか? 他人が作ったものだと何かを勘違いしたり、 クラスやメソッドの意図が読み取れなかったりして間違ったことを する可能性があると思うのですが、自分で設計して 自分で書いたものを間違って認識することもあるのでしょうか? 何かを間違ったとしても、大昔に作ったコードをもう一度 書き換えようとするときでも、そのようなときは「あれ?どうだったっけ?」 と思ってコードを読んだりコメントがあればそれを読むと思ったんです。 「必ず」が保証されるためにインターフェースを使うなら、 ここはミスをしないと思えばインターフェースは使う必要がないと いうことなのでしょうか? インターフェースがミス防止のためという認識自体違うのでしょうか?

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

関連するQ&A

  • オブジェクト指向について

    趣味でプログラミングをしているのですが オブジェクト指向の概念がうまく理解できていないので 教えていただけませんでしょうか? 解説本などを読むと、オブジェクト指向のクラスを動物クラスを継承して犬クラスや猫クラスなどと解説してあるのですが。 どうも、僕がプログラム設計するとしっぽクラスや泣き声クラスなどといった違った動物の類似機能をまとめてのクラスをつくり各メソッドとしてしまいまっています。 動物クラスや乗り物クラスを組み合わせてプログラムを設計する事ができません。 本格的なプログラムを組む用途では無いので気にしなくても目的の機能が実装できれば問題無いと知人からは言われ(面倒なので教えたくないのかもしれませんが)そのまま来てしまいました。 最近、気になって来たので。 正しい使い方を身に着けたいと思いチャレンジしていますが、変な癖がついていて犬や猫クラスなどと思いながら設計していると思考が止まってしまいます。 そこで、下記のことを教えていただけませんでしょうか? (1)泣き声クラスなどの同機能を1つのクラスにしてしまう設計しか出来ない(発想できない)のは考え方のどこがわるいのでしょうか? (追記:一部分だけならペンギンクラス猫クラスなどと言う動物クラスの継承的な発想はできるのですが実際のプログラミングの際は動物のようなわかり易い物オブジェクトとして目に見える物体ではない事柄をオブジェクト化にする事が難しく感じるのではないかと思います。) (2)今までの小さい規模での開発なら、クラスのつくり方がおかしくても不具合は無かったのですが、どのような時に困る事があるのでしょうか?(解説などでも再利用性などと、さらっと解説されていますがイマイチぴんときません) (3)正しくオブジェクト指向がマスター出来ている方にとって、どのクラスにどのメソッド実装するか悩む事などはあるのでしょうか? また、設計で一番悩むのはどのあたりですか? (4)UMLのマスターは必須でしょうか?(現在は、なんとなくUMLぽい感じでメモ書きをつくり、えせオブジェクト指向でプログラムを組んでいます。) (5)その他アドバイスがあればお願いします。 ※乱文で問題もハッキリせず質問の整理等がうまくいっていないと思いますが1つの項目だけでも構いませんので、ご教授お願いします。

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

    インターフェースについて学ぼうと思っているのですが、 どうもいまいち何がなんだかわからなくなっています。 インターフェースはクラスによって実装され、 実装クラスはインターフェースで宣言されている 抽象メソッドを実行する とあるのですが、実装とは何ですか? 抽象メソッドとは何ですか?

    • ベストアンサー
    • Java
  • インターフェースでオブジェクトを取得する意味

    http://yukimura1227.blog.fc2.com/blog-entry-49.html 上記ページにSpringを使用したサンプルプログラムがあり試しに動かしてみたのですが 疑問に思ったことがあるので質問させてください。main()関数の中に SearchGoodsService searchGoodsService = appContext.getBean(SearchGoodsService.class); という記述があり戻り値の型はSearchGoodsService(インターフェース)となっています。 ここをインターフェースではなく実装クラスのSearchGoodsServiceImpl ではダメなのでしょうか。 上記ページの下部の方に 「インターフェースを使うのはSearchGoodsServiceImplにプログラムが依存しないようにするためで、 SearchGoodsServiceImplがどう変わろうが、変更の必要がない」 という趣旨の記述があります。 ここで1つ疑問なのですが 戻り値の型が実装クラスの型であっても SearchGoodsServiceImplがどう変更(メソッドが増えたり、減ったり)しても影響がないと思います。 また、戻り値の型がインターフェースであたとしてもSearchGoodsServiceという インターフェース名の変更があった場合、呼び出し元の 全てのプログラムを修正しなくてはならないと思いますがいかがでしょうか。

    • ベストアンサー
    • Java
  • フレームワークによくあるインターフェースについて

    たとえばSpringだとInitializingBeanインターフェースを 実装してafterPropertiesSetメソッドに処理を書くことによって Beanを初期化したときにその処理が実行されるようですが、 これはどのような仕組みでそのインターフェースを実装しているか どうかを判断しているのでしょうか? getInterfacesメソッドを使うとそのクラスが実装している インターフェースを調べることができるようですが、 これは親クラスのインターフェースまでは調べられないようですし、 フレームワークはどのようにしてそのクラスが実装している インターフェイスを判定しているのか不思議です。

    • ベストアンサー
    • Java
  • オブジェクト指向で、インターフェースにないメソッドを呼ぶ

    こんにちは。質問させてください。 現在C++でプログラムを書いているのですが、以下のようなプログラムを書いたとします(これ例ですので、実際のプログラムとは異なります)。 // ポインターを抽象化 class PointerInterface { }; // 抽象化したクラスを継承して整数型のポインタを作る class IntPointer : public PointerInterface { private:   // int型のポインタ   int *p; public:   int* get()   {     return p;   } }; // 抽象化したクラスを継承して少数型のポインタを作る class FloatPointer : public PointerInterface { private:   float *p; public:   float* get()   {     return p;   } }; PointerInterface* CreateInterface( bool flag ) {   PointerInterface* result = 0;   if( flag )   {     result = new IntPointer;   }   else   {     result = new FloatPointer;   }   return result; } void setIntPointer( PointerInterface* ptr ) {   // ここでint型のポインターを取り出して操作したい } void main() {   PointerInterface* ptr = CreateInterface( true );   setPointer( ptr ); } インターフェースは同じなのに継承先に内含されている変数のタイプが違い、それを取得したい場合が出てくると思います。 こういう場合どのように実装すれば、より美しくコーディングすることができるでしょうか? /* 私は 1:PointerInterfaceにvoid*を戻すメソッドを宣言する 2:setIntPointerの中で無理やりキャストして子クラスのgetを無理やり呼び出す という2つの方法が思いついたのですが、なんだかどっちのコーディングもピンときません。 お知恵を貸してください! ※今回はtemplateを使うというのは、なしでお願いします。 */

  • インターフェイスの使い方がわかりません(初心者です)

    Javaを始めたばかりの初心者です。 「やさしいJava」を買って一通り学んだのですが、 インターフェイスの使い方がよくわからず、困っています。 インターフェイスを実装することでインターフェイスが持つメソッドがすべて定義されてることが保障される、 というのはわかるんですが、そのことがどうして有用なのでしょう? また、具体的にはスレッドを扱うときにRunnableインターフェイスを実装する理由がわかりません。 Threadクラスのオブジェクトを作成するときに、 Runnableを実装したクラスのオブジェクトの変数を 引数にしないといけないんですよね? このとき、Runnableインターフェイスが 「runメソッドが定義されていなければならない」 とだけいうものだったとしたら、 Runnableを実装してなくてもrunメソッドさえ定義してあれば 実行できそうな気がするんですが・・・

    • ベストアンサー
    • Java
  • インターフェイスと抽象クラス

    なかなか理解が難しくて苦しんでいます。 で自分なりに理解したのですが、 抽象クラス→内容に決まっているメソッドと決まっていないメソッドがある場合に決まっていないメソッドを あとからオーバーライドするだけでスーパークラスで定義したすべてのメソッドを利用できる。 これでただしいでしょうか? で、インターフェイスなのですが、この抽象クラスとそっくりなんですが、 (1)変数は定数になる(強制static)(2)メソッドは名前のみの宣言(内容は記述できない) と言うことで、かなり???なのです。 何のために・・・???記述するんでしょうか?? ただひとつメリットがあるとしたら、インターフェイスを実装すると、インターフェイスの配列でインスタンスを 生成出来るということぐらいでしょうか。 そこでちょっとお門違いの疑問かもしれないんですが、 Runnable、やMouselistenerはメソッドの内容が書かれていないのに、 なぜ機能を持たせることが出来るのでしょう??? 認識違い、間違い等ありましたら、教えてください よろしくお願いいたします。

    • ベストアンサー
    • Java
  • オブジェクト指向で分からないことが。

    オブジェクト指向で分からないことが。 1.クラスAから、文字列引数を指定して、クラスBがインスタンス化されたオブジェクトを取得する。 (getInstance的メソッド)引数の文字列にマッピングされたオブジェクトを取得する感じ。 2.1.で取得したオブジェクトから、各オブジェクトを取得するメソッドを呼び出し、オブジェクトを取得する。(仮にクラスC) 3.2.で取得したクラスCのメソッドを呼び出す。 このとき、クラスCのメソッド内で、1.で利用された引数を利用したいです。 そもそもクラスCは、1.を経てしか取得されないものの為、再度1.の引数を渡したくありません。 内部的な値なので、スコープpublicのセッターを用意して、クラスA内からの書き換えが出来ては困ります。 こういう場合、どういうクラス設計を行えば良いのでしょうか?

    • ベストアンサー
    • Java
  • 抽象クラスとインターフェースの使い分け

    抽象クラスとインターフェース、この2つの違い、使い分け方が未だにはっきりとはわかりません・・・ 抽象クラスもインターフェースも実装は持たず、抽象クラスはサブクラスで、インターフェースはそれをインプリメントしたクラスで実装を行うのですよね? 両者ともに言わば中身はなく外枠だけ定義されていると言えると思うのですが、だとしたらこの2つの違いや使い分けってどうなるのでしょうか。 抽象クラスでは部分的な実装を含められることや、インターフェースでは実装クラスが全てのメソッドを実装しなければいけない、複数実装できるといった使い方の違いしかないのでしょうか。 だとしたら実際に抽象クラスとして用意するのかインターフェースとして用意するのかの選択基準はなんなのでしょうか。 明確にこういう場合は抽象クラス、こういう場合はインターフェースなどと言った使い分けってあるのでしょうか。

  • アブストラクトとインターフェースの簡単な一例文

    JAVAについて質問よろしくお願いします。 abstract抽象クラスとインターフェースについて下記理解なのですが、超かんたんな一例など欲しいのですが何かないでしょうか。たとえば package round1.chapter1; public class Helloworld { public static void main(String[] args) { System.out.println("こんにちは!"); } } というような一文です。 ~私の理解~ アブストラクトとは、違ったクラス内で同一メソッドがある場合は親クラスに置き、違ったメソッドがある場合は抽象クラスとして親クラスに置いて、実装はサブクラスに任せるという形式で使われる言葉 インターフェースとは、機能だけを仕様書として書いておき、定義されたとおりのメソッドを実装しないといけないという呼び出し方の統一を図る際に使われるメソッド置き場 ~~~~~ このふたつについてものすごく簡単な使用例を頂きたいです。 よろしくお願いいたします。

    • ベストアンサー
    • Java