インターフェースとは何なのか?

このQ&Aのポイント
  • インターフェースとは何なのか?私の中では、「関数をたくさん定義して、継承させるためのもの」という適当な認識をしているが、IDirect3D9インターフェースは、インスタンス化されており、これを継承したクラスは使われていない。しかし、普通にメンバ関数を扱っている。
  • IDirect3D9インターフェースの役割は何でしょうか?インターフェースとは、継承を利用して関数をまとめるためのものという一般的な認識があるが、IDirect3D9インターフェースは単独でインスタンス化され、そのメンバ関数が利用されている。
  • なぜIDirect3D9はインターフェースとして扱われているのでしょうか?それは、IDirect3D9が他のクラスによって継承され、そのメンバ関数が利用されることを意図して作られたためです。インターフェースの名前を付けることで、他のクラスが継承して利用することを明示しています。
回答を見る
  • ベストアンサー

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

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

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

  • ベストアンサー
  • MrBan
  • ベストアンサー率53% (331/615)
回答No.1

Interfaceというのは、 こういう時にこの引数でこれを呼ぶと、こうなる。 他者との間で、呼出と応答のお約束を決めたものです。 (原義は、顔の間、界面という意味です) そして、本来的なinterfaceは必ずしも継承とは関係ありません。 (継承のないC言語であっても関数宣言などはinterfaceの一部です) IDirect3D9に限らず、interfaceを *使う際には* インタンス化/実体化が必要です。 DirectXのようなCOMのinterfaceは、通常 *提供する側が* 継承したインスタンスを提供するので、 使う側は、GUIDを指定するだけで、その具象クラスをあまり意識していないだけです。 中身を意識せず、呼び出して使えるのがinterfaceであって、 提供する側(ここではMicrosoft)は、interfaceのルールさえ守れば、 中身の実装を自由に変えられて、影響を与えないのがinterfaceの利点です。 (実装を公開しないので、こっそり?DirectX側のバグを直したりすることが可能です) 「受付担当」インターフェイスがあったとして、 適切な同じ回答をしてくれる限り、それが「事務員」クラスの「鈴木」インスタンスでも、 「人間」クラスの「田中」インスタンスでも、 「自動応答装置」クラスの「Answer01」でも、受付にお願いした方はそれを気にしない。 受付業務を行うクラスが受付担当インターフェイスを実現し、 そのクラスのインスタンスが実際の責務を果たせばよい。 インターフェイスを解したやり取りというのはそういうことです。 # 共通のインターフェイスがないと、人間にお願いする時と自動応答装置にお願いする時には手順が変わってしまうでしょう。

niko_mingo
質問者

お礼

バッチリよく分かりました。 継承というのはオプショナルで、本質的には継承するために…ということではないのですね。

関連するQ&A

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

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

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

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

    • ベストアンサー
    • Java
  • ADODB.Connectionはインターフェイス

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

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

    継承・実装の関係について悩んでいます。 ここでは、アクセス制御を考えずに、インスタンスか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
  • Interface変数について

    C#勉強初めて間もない者です。 Interfaceについて教えて頂きたい事あります。 Interfaceとは規約を定める為のクラスで、メソッドは定義してあるだけで中身はそのInterfaceを継承したクラスで実装する物だと認識しています。 そこで以下のようなコーディングに出会い混乱しました。。。 IList loList = "22,22,".Split(','); ※へたくそな例ですがお許し下さい 上記のコーディングで、中身のないインターフェイスのloList変数が何故抽象メソッドして定義されている「Add」やプロパティ「Count」が使えるようになるのでしょうか? ご質問に答えて下さる方いらっしゃいましたら宜しくお願いします。

  • 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
  • 継承について

    みなさま、どうかお知恵を貸して下さい。 javaを勉強中で、本を読みながら試しに動かしています。 現在、実現したい動作が実現可能かどうかを調べているところです。 そのため、環境やバージョン等は決まっておりません。 むしろ、実現可能な環境やバージョンがあれば、教えてください。 実現したい機能ーーーーーーーーーーーー 親クラスAにメンバーとメソッドを定義します。 Aを継承する子クラスBを定義します。 プログラム中で、A、Bのインスタンスを生成します。 そして、A、Bを継承するCのインスタンスを生成したいのです。 Cのメンバーやメソッドは、Bと同様のものです。 この場合、BのクラスからCのようなインスタンスを作成することは、可能なのでしょうか? ・・・Cを定義していないので、おそらく不可能かと思います。 やはりこういった場合、Aを継承しているBを継承するCクラスを定義しておく必要があると考えています。 では、Cを継承するD,Dを継承するE・・・というように、いくつ必要になるかわからない場合、最大数分継承したクラスを用意すべきでしょうか。 なぜ、そうしたいかというと、組織図のようなものを作成したいのですが、組織図を構成する人数は、ユーザーの任意としたいのです。 継承したクラスを用いれば、そのまま組織図の体系を表現できる気がしました。 質問が大雑把になってしまい、申し訳ないのですが、お力を貸していただければ幸いです。

    • ベストアンサー
    • Java
  • シングルトンパターン

    お世話になっております。 ただいま、C++言語の猛勉強中です。 デザインパターンのシングルトンでDirectX9インターフェイスを作成したところ、 以下のエラーが出ました。 Interface.obj : error LNK2001: 外部シンボル ""private: static class Dx9Interface * Dx9IFMgr::Dx9" (?Dx9@Dx9IFMgr@@0PAVDx9Interface@@A)" は未解決です。 Debug/png_test.exe : fatal error LNK1120: 外部参照 1 が未解決です。 ソースは以下です。 // ヘッダー //---------------------------------------------------------- class Dx9Interface { public: Dx9Interface(); bool InitDx9(HWND hWnd_); IDirect3D9* GetD3D(); IDirect3DDevice9* GetD3DDevice(); virtual ~Dx9Interface(); private: HWND hWnd; HINSTANCE hInstance; IDirect3D9* pD3D; IDirect3DDevice9* pD3DDevice; D3DPRESENT_PARAMETERS d3dpp; D3DDISPLAYMODE d3dmode; bool initialize; // 初期化したか }; // Dx9インターフェイスクラスをシングルトンで作成するクラス //---------------------------------------------------------- class Dx9IFMgr { public: // インスタンスの作成 static Dx9Interface* CreteDx9(); // インスタンスの削除 static void DelDx9(); private: // インスタンス static Dx9Interface* Dx9; Dx9IFMgr(){}; }; ソースは、次に追記します。

  • インターフェイスと抽象クラス

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

    • ベストアンサー
    • Java
  • singletonによるインターフェイスの実装

    Java勉強中の初心者です。 標題の件についてお願いします。 以下、簡単に条件を説明させていただきます。 Aクラス = メインクラス Bクラス = インターフェイスクラス Cクラス = DとEを動的に生成するクラス Dクラス = インターフェイスを実装するクラス Eクラス = インターフェイスを実装するクラス AクラスにB.getInstance(name)があります。 for文の無限ループがあります。 Cクラス class C { public static B getInstance(String name) { // Aクラスのaと変数nameが比較して一致したら // Dクラスのインスタンス生成 // 一致しなかったらEクラスのインスタンス生成 if(A.a.equals(name)){ return D.getInstance(); }else{ return E.getInstance(); } } } Dクラス class D implements B{ private D() { } public static D getInstance() { D d = new D(); return d; } // インターフェイスでのメソッド省略します。 } Eクラス class E implements B{ private E() { } public static E getInstance() { E e = new E(); return e; } // インターフェイスでのメソッド省略します。 } この条件の時にnewするたびにインスタンスが 生成されてしまいます。 インスタンスの生成が一度だけしか 生成されないようにするには、C,D,Eクラスで どのように記述すればいいか悩んでいます。 (骨組みは書けましたが) クラスを簡単に省略してわかりづらいと 思いますがよろしくお願いします。

    • ベストアンサー
    • Java

専門家に質問してみよう