• ベストアンサー

インタフェースにも実装をもてるの?

Sun の仕様書などを見ても、インタフェースの使用をみても、メソッドを呼び出した時の処理が書かれていますよね。。。 私の記憶では、インタフェースでは実装をもてなかったハズなんですが… 実装する亊ができるのでしょうか? どなたか、知っている方がいればどうかよろしくお願い致します。

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

  • ベストアンサー
回答No.4

「インターフェイスは実装部分をもてない」というのは正しいですが、「インターフェイス<を実装する>クラス」を書くことができます。そして、実際に扱うインスタンスオブジェクトは、この実装クラスのインスタンスなのです。 試しに、 Connection conn = (DB接続をとるメソッド呼び出し); System.out.println (conn.getClass ()); などとして、connのクラス名を確認してみて下さい。 Connectionそのものではなく、別の名前が出てくる筈です。 あるインターフェイス(クラス)を実装(拡張)するクラスのインスタンスは、元のインターフェイス(クラス)のインスタンスとしても扱う事ができるのです。これを多態性(polymorphism)といいます。

参考URL:
http://www.google.co.jp/search?q=Java+%91%BD%91%D4%90%AB

その他の回答 (3)

  • sasadora
  • ベストアンサー率68% (59/86)
回答No.3

具体例として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)
回答No.2

あなたのおっしゃるとおり、インタフェースは実装することはできません。 では、実際に実行されるメソッドの実装があるのはどこでしょう? そのインタフェースを実装している「クラス」ですよね? インタフェースの仕事は、あくまでもメソッドの名前と「役割」を決めることです。その「実装」は、インタフェースを implement するクラスによって提供されるのです。 ここでいう「役割」とは、メソッドがどのようなことをするのか、という命令です。例えば、「123×456の計算を行う」などというものです。 これに対して、「実装」というのは、実際にどうやって命令を遂行するか、ということです。上の役割の例に対する実装は、例えば、「筆算する」「暗算する」「電卓を使う」などいろいろ考えられますが、どれも与えられた命令(ここでは掛け算)を行うことに変わりありません。 では、仕様書に書かれているインタフェースに関する記述は何なのかというと、上で書いたメソッドの「役割」を定めているのです。「実装」がどのようなものになるかは、インタフェースそのものにとっては関係ありません。実装を提供するのは、あくまでもインタフェースを implement するクラスなのです。 さて、インタフェースは「インスタンス化できない」ことも重要です。(実装がないのですから当然ですね) java.sql.Connection インタフェースの createStatement メソッドでどうやって Statement オブジェクトを作るのか、と疑問に思っていらっしゃるようですが、あくまでも実際に動作を行うのは「Connection を実装する何らかのクラスのインスタンスのメソッド」であることを忘れてはいけません。 もちろん、このメソッドが返すのは「Statement というインタフェースを実装する何らかのクラスのインスタンス」です。

回答No.1

インタフェースの関数はすべてabstractですよ。 つまり実装はできません。 コメント等で処理内容を書くことはできますが・・・。 心配だったので確認してみましたが、 やはり無理のようです。 コンパイルが通りません。

tomatosuki
質問者

補足

返信ありがとうございます。 例えば、 java.sql.Connection インタフェース の以下のメソッドは、Statement オブジェクトを生成するものです。これは、Connectionインタフェースではどうやって実装しているのでしょうか。というか実装をもてないのに、どうやって実現しているのでしょうか? Statement createStatement() SQL 文をデータベースに送るための Statement オブジェクトを生成します。

関連するQ&A