• ベストアンサー

なぜインタフェースを使うのか?

bobvivの回答

  • bobviv
  • ベストアンサー率50% (13/26)
回答No.8

 インターフェースの威力を知りたければ、たとえばストラテジ(Strategy)パターンと呼ばれているデザインパターンのサンプルコードなど一度ごらんになるとよいと思います。  細かいこと言うと、インターフェースが実現するポリモーフィズム(多態性)は、コンパイル時にはインターフェースSの型として型チェックされたオブジェクトが、実行時にはSを実装したクラスのインスタンスなら何でもよいという「ズレ」によって支えられています。インタフェースの効能はというと、  1.多態性(すでにご指摘の)  2.コントラクトが守られているかどうかをコンパイラによってチェックさせることができる。  3.単一のオブジェクトに対して、今問題にしたいひとまとまりの機能一覧を抽象して顕在化させることができる。この時特に「他のインタフェースや実装の詳細は”見えないし、見なくて済む”」 といった諸点にあると思います。  いずれにしろ、JavaやC#をお書きになるならインターフェースを理解しないっていう手はありません。その威力に触れたら、今とは逆にインターフェース中毒になってしまうくらい使いたくってしょうがなくなると思いますよ^^。

関連するQ&A

  • インターフェイス、列挙型について

    インターフェイスにclone()メソッドが無くて気づいたのですが、 インターフェイスはObjectを継承しないのですか? しかしそれ以外のメソッドは定義されていたので、何らかのクラスを継承しているのでしょうか? 列挙型のメンバにもclone() は無かったですけど、別のメソッドは持っていました。 列挙型や、そのメンバもスーパークラスを持っているのですか?

  • ADODB.Connectionはインターフェイス

    いつもお世話になっております。 C#で特定のDBに接続するクラスを作ろうとADODB.Connection(ADO.Conn)を継承しようとしたところADO.Connはインターフェイスであるため、各メンバの実装をしなくてはなりません。ADO.Connはオブジェクトととしてインスタンスを生成できていたため、なぜインターフェイスがインスタンスを生成してオブジェクトとして使えるのかがわかりません(Excel.Applicationなども同様です)。 これはどのような仕組みになっているのでしょうか?

  • インターフェイスと抽象クラスについて

    オブジェクト指向について学んでいます。 下記のように、単体でクラスを定義して各メソッドの実行する方法などは理解しているつもりです。 class Test { public function __construct() { // コンストラクタ } public function setName($name) { $this->name = $name; } public function getName() { return $this->name; } } $test = new Test(); $test->setName('太郎'); echo $test->getName(); // 太郎 ここまではいいのですが、インターフェイスと抽象クラスってどんな時に使うべきなのでしょうか? 簡単な例で使い方を紹介しているサイトはいくつかあるのですが実用性がないものばかりで、これらは本当に必要なものなのか?という疑問があります。。。 具体的に実用性がある例で使い方とメリットをおしえていただけませんでしょうか?

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

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

  • マルチプルインスタンスのメリット

    100%の自信をもって回答できる方のみ回答をお願いします。 Java等のオブジェクト指向プログラミング技術において、クラスからインスタンスを たくさん作れるというのが特徴の一つとなっていますが、クラスからインスタンスを たくさんつくれるメリットはなんでしょうか。 クラスからインスタンスをたくさん作れなくても、1つ作れば動くプログラムはたくさんありますし、 そういうプログラムであれば、staticなアクセスにすればよいですよね。 クラスからインスタンスがつくれることを説明した本やサイトは山ほどありますが、 インスタンスがたくさん作れることのメリットを説明した本をみたことがなく、 「なぜオブジェクト指向でつくるのか」という本を買って読みましたが、 納得がいくメリットを感じられませんでした。 また世の中のソースをみると、みんな、すぐにクラスを作ってオブジェクトを作っていますが、 みなさんがどうして、オブジェクトを作らなくてもコーディングできるケースのプログラムを オブジェクトを作るのか不思議でしかたありません。 どうしてオブジェクトを作らなくてもいいケースでもオブジェクトを作るのか、 またたくさんオブジェクトを作れるメリットはなんなのか、教えてください。

  • Javaのインターフェイスの意味

    以前あった質問の回答やネット上での説明を見たのですが、よくわからなかったので質問します。 public interface CharSequence { int length(); } class MyClassWithCharSequenceIF implements CharSequence { public int length() { return 0; } } インターフェイスには、よく多重継承を可能にするメリットがあるという説明がありますが、 public interface CharSequence { int length(); } こんな短い処理を継承する意味があるのでしょうか?クラス内で実装するためにまた public int length() { return 0; } を書かなければならないのは時間・手間のメリットは何もないように思えます。というよりむしろ単なる二度手間ではないでしょうか? クラスの継承は長い記述などを一まとめにして呼び出せるメリットがありますが、インターフェイスの継承にはそれがありません。 いったい何の意味があるんでしょうか?

    • ベストアンサー
    • Java
  • VBがオブジェクト指向言語でない理由

    一般的にVBはオブジェクト指向ではない(VB7でその方向へ向かう)といわれていますが、実際にVBをさわり始め、いろんな本を読んでみると、 1)クラスが作成でき、構造体と関数を1つにまとめ、メンバ(プロパティ・メソッド)を定義付けできる 2)Implementsステートメントでクラスの継承が出来る と、ある程度のオブジェクト指向言語の要件を備えているように見えます。 といっても私はJAVAもSmallTalkも知らないので、「何が真のオブジェクト指向か」というのを良く判っていないのかも知れないのですが。 しかしC++関連書などを読んでいると出てくるクラスの使用例などはVBのそれと大差なく、なぜクラスの作成もできて、継承も可能なVBがオブジェクト指向ではないのか? という疑問がわいてきました。 JAVAとは何が違うのか? これが出来ないからオブジェクト指向ではないのだ! という理由をご存じの方、回答もらえればうれしいです。

  • 継承・実装の関係で悩んでいます。

    継承・実装の関係について悩んでいます。 ここでは、アクセス制御を考えずに、インスタンスかstaticかabstract(ここではabstract final staticやabstract classのこと)の違いで、どう継承するのか考えています。 // 継承 はメソッドのオーバーライドのことを考えます。(オーバーロードは考えない) クラスAからクラスBでオーバーライドしたメソッドは、 クラスCでさらにオーバーライドできるのでしょうか? クラスCが クラスBのクラスAからオーバーライドしたメソッド をクラスBのメソッドとして見たときに、オーバーライドすることは可能なのでしょうか? クラスA │ インスタンスフィールドA │ staticフィールドA │ │ クラスA() { } │ │ インスタンスメソッドA () { } │ staticメソッドB() { } ↓ クラスB extends クラスA │ インスタンスフィールドA // 継承 │ インスタンスフィールドB │ staticフィールドB │ │ サブクラス1() { } // コンストラクタは継承しない、super()で呼び出す │ │ インスタンスメソッドA () { } // 継承 │ │ インスタンスメソッドB () { } │ staticメソッドB () { } ↓ クラスC extends クラスB implements インタフェースD, ... ↑ インスタンスフィールドA // クラスBのフィールドを継承 │ インスタンスフィールドB // クラスBのフィールドを継承 │ インスタンスフィールドC │ staticフィールドC │ │ サブクラス2() { } │ │ インスタンスメソッドA () { } // クラスBのメソッドを継承 │ インスタンスメソッドB () { } // クラスBのメソッドを継承 │ インスタンスメソッドD () { } // インタフェースDのメソッドを実装 │ インスタンスメソッドE () { } // インタフェースDのメソッドを実装 │ │ │ インスタンスメソッドC () { } │ staticメソッドC() { } │ interface インタフェースD extends インタフェースE ↑ │ staticフィールドD // public static final │ │ インスタンスメソッドD() { } // public abstract │ インスタンスメソッドE() { } // 継承 │ interface インタフェースE staticフィールドE // public static final インスタンスメソッドE() { } // public abstract

    • ベストアンサー
    • Java
  • クラス?オブジェクト?インスタンス?何がなんだか・

    一般的なオブジェクト指向の 定義として下記で合っているのでしょうか お願いします クラス:第2実体(人間) インスタンス:第1実体(例:山田) オブジェクト:色々なインスタンスをさして、抽象的に総称としてオブジェクト 例えば・・クラス:人間、インスタンス:山田 クラス:犬、インスタンス:ゴン 違うクラスのインスタンスをまとめて呼ぶ際にオブジェクト? よく分からなくなっています、よろしくお願いします

  • オブジェクト指向の利点と欠点

    オブジェクト指向についてある程度勉強しました。そしてだいたいのプログラムの組み方は分かってきました。しかし、まだまだはじめたばかりなので実際のところ利点と欠点がわかりません。オブジェクト指向の原理はだいたいわかりますが、多分経験が不足している状態です。カプセル化や継承、多様性...を使うことで度のようなメリット、デメリットがあるのか具体的に教えてください。