- ベストアンサー
インタフェースにも実装をもてるの?
Sun の仕様書などを見ても、インタフェースの使用をみても、メソッドを呼び出した時の処理が書かれていますよね。。。 私の記憶では、インタフェースでは実装をもてなかったハズなんですが… 実装する亊ができるのでしょうか? どなたか、知っている方がいればどうかよろしくお願い致します。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
「インターフェイスは実装部分をもてない」というのは正しいですが、「インターフェイス<を実装する>クラス」を書くことができます。そして、実際に扱うインスタンスオブジェクトは、この実装クラスのインスタンスなのです。 試しに、 Connection conn = (DB接続をとるメソッド呼び出し); System.out.println (conn.getClass ()); などとして、connのクラス名を確認してみて下さい。 Connectionそのものではなく、別の名前が出てくる筈です。 あるインターフェイス(クラス)を実装(拡張)するクラスのインスタンスは、元のインターフェイス(クラス)のインスタンスとしても扱う事ができるのです。これを多態性(polymorphism)といいます。
その他の回答 (3)
- sasadora
- ベストアンサー率68% (59/86)
具体例としてConnectionインターフェースについて書きます。 おっしゃるとおり、Connectionインターフェースには、実装はされていません。 ではどうやってDB接続を行なっているかというとそれは、それはJDBCドライバによって実装されています。 DriverManager#getConnectionとやるとConnectionインターフェースを返しますが、このとき返されるオブジェクトは、「Connectionインターフェースを実装した何らかのオブジェクト」です。なにが取得されるかはJDBCドライバによって異なります。 たとえば、OracleのJDBCドライバならOracle用のオブジェクトが。DB2ならDB2用のオブジェクトが取得されます。 なにが取得できるかは知る必要がありません。どんなオブジェクトが取得されるか分かりませんが、それがConnectionインターフェースで定義されるメソッドを実装していることは分かります。 なので、異なるDB製品を使ったとしても、返されるインターフェースは決まっているので、同じように扱うことが出来ます。 実際のオブジェクトがどんな処理をしながらDB接続を実現しているのかを意識することなく、インターフェースの使い方だけを知れば、様々なDBの接続を得る方法が統一できることになります。 Connectionについて説明しましたが、他のインターフェースも同様です。例えば List l1 = new ArrayList(); List l2 = new LinkedList(); どちらもListインターフェースを継承しています。実装は異なりますが、Listインターフェースを通して使用する限りは、中身がどう実装されているかを気にせず、同じ動作を期待することができます。
- UKY
- ベストアンサー率50% (604/1207)
あなたのおっしゃるとおり、インタフェースは実装することはできません。 では、実際に実行されるメソッドの実装があるのはどこでしょう? そのインタフェースを実装している「クラス」ですよね? インタフェースの仕事は、あくまでもメソッドの名前と「役割」を決めることです。その「実装」は、インタフェースを implement するクラスによって提供されるのです。 ここでいう「役割」とは、メソッドがどのようなことをするのか、という命令です。例えば、「123×456の計算を行う」などというものです。 これに対して、「実装」というのは、実際にどうやって命令を遂行するか、ということです。上の役割の例に対する実装は、例えば、「筆算する」「暗算する」「電卓を使う」などいろいろ考えられますが、どれも与えられた命令(ここでは掛け算)を行うことに変わりありません。 では、仕様書に書かれているインタフェースに関する記述は何なのかというと、上で書いたメソッドの「役割」を定めているのです。「実装」がどのようなものになるかは、インタフェースそのものにとっては関係ありません。実装を提供するのは、あくまでもインタフェースを implement するクラスなのです。 さて、インタフェースは「インスタンス化できない」ことも重要です。(実装がないのですから当然ですね) java.sql.Connection インタフェースの createStatement メソッドでどうやって Statement オブジェクトを作るのか、と疑問に思っていらっしゃるようですが、あくまでも実際に動作を行うのは「Connection を実装する何らかのクラスのインスタンスのメソッド」であることを忘れてはいけません。 もちろん、このメソッドが返すのは「Statement というインタフェースを実装する何らかのクラスのインスタンス」です。
- feather0411
- ベストアンサー率38% (8/21)
インタフェースの関数はすべてabstractですよ。 つまり実装はできません。 コメント等で処理内容を書くことはできますが・・・。 心配だったので確認してみましたが、 やはり無理のようです。 コンパイルが通りません。
補足
返信ありがとうございます。 例えば、 java.sql.Connection インタフェース の以下のメソッドは、Statement オブジェクトを生成するものです。これは、Connectionインタフェースではどうやって実装しているのでしょうか。というか実装をもてないのに、どうやって実現しているのでしょうか? Statement createStatement() SQL 文をデータベースに送るための Statement オブジェクトを生成します。