• ベストアンサー

インターフェイスは何故必要か

 Javaの初心者です、宜しくお願いします。  Javaには継承という仕組みがあるのに何故インターフェイスという 仕組みが必要なのでしょうか。  勿論、2個の親クラスからの継承を嫌ったのはなんとなく理解出来るのですが それなら子クラスでインターフェイスの機能を別途作ってやれば、わざわざイン ターフェイスという仕組みを考える必要がないと思うのですが。  親クラス、子、孫、またその孫としてやり、そのどれかのクラスに インターフェイスの機能を持たせれば良いだけと考えるのですが。  インターフェイスのメッソドを全て実装する必要とかもなくなると思うのですが。  以上宜しくお願いします。

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

  • ベストアンサー
  • anyhelp
  • ベストアンサー率43% (80/183)
回答No.4

あなたの言う通り、もしもインターフェースが仕様に無い言語(考える必要のない言語)の場合では、実装のない抽象的な扱いを前提としてクラスで代用する事もできます。この場合、シグネチャー通りに正しく子クラスで実装をしなければなりません。人間が正しく操作を行う事が前提となります。インターフェースがあれば実装がされていなければ未実装である事を機械が人間にエラーという形で伝えます。理論はともかくこの利点はあります。 インターフェースは和訳の通り名前の通り接続面を表す言葉です。クラス同士で接続(通信)する場合には、互いに正しく呼び出す関数(メソッド)のシグネチャー(面)を知っていることが必要になります。逆に考えればそれさえ分かれば正しく接続出来るという事です。 たとえば、インターフェースにメソッドが20個定義があるが、実際2つしか使っていないという事もあり得ますね。わざわざ残りの使いもしない18個も実装しないといけないのはうっとうしいという考えも分かります。というのも言語によってはインターフェースに該当する定義の段階で実装を必須かどうかを選べる言語もあるからです。JavaにおいてJavaの言語ルールで書かざる得ないと思いますが、様々言語をやると利点欠点を知るキッカケになると思います。普及している言語だからと全てが優れているとは限らないのでそういう視点は良いと思いますね。

その他の回答 (3)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

では、次のプログラムで、 interface IA → class IA (IB,ICも同様)にして、継承だけを使って書き換えてください。 methodXXのERROR,OKはこれと同じになるようにしてください。 とても面倒になるのでは? これがID,IEと増えたらもっと複雑になります。 複数インターフェースが同列に並んでいるからこそ、便利なことがあります。 interface IA { void a(); } interface IB { void b(); } interface IC { void c(); } class ImplAB implements IA,IB { public void a() {}; public void b() {}; } class ImplAC implements IA,IC { public void a() {}; public void c() {}; } class ImplBC implements IB,IC { public void b() {}; public void c() {}; } class ImplABC implements IA,IB,IC { public void a() {}; public void b() {}; public void c() {}; } public class C2 { static <T extends IA&IB> void methodAB(T x) {x.a();x.b();} static <T extends IB&IC> void methodBC(T x) {x.b();x.c();} static <T extends IA&IC> void methodAC(T x) {x.a();x.c();} static <T extends IA&IB&IC> void methodABC(T x) {x.a();x.b();x.c();} public static void main(String[] args) { ImplAB objAB = new ImplAB(); ImplBC objBC = new ImplBC(); ImplAC objAC = new ImplAC(); ImplABC objABC = new ImplABC(); methodAB(objAB); // OK methodBC(objAB); // ERROR methodAC(objAB); // ERROR methodABC(objAB); // ERROR methodAB(objBC); // ERROR methodBC(objBC); // OK methodAC(objBC); // ERROR methodABC(objBC); // ERROR methodAB(objAC); // ERROR methodBC(objAC); // ERROR methodAC(objAC); // OK methodABC(objAC); // ERROR methodAB(objABC); // OK methodBC(objABC); // OK methodAC(objABC); // OK methodABC(objABC); // OK } }

  • notnot
  • ベストアンサー率47% (4900/10361)
回答No.2

静的型言語でポリモルフィズムを実現するために必要です。 ポリモルフィズム(ポリモーフィズム)についてご存じなければ勉強してください。 Rubyのようにコンパイル時にメソッドの有無をチェックしない言語だとインターフェースなどいらないのですが、コンパイル時にチェックしようとするとどうしても必要です。 べつの言い方をすると、ポリモルフィズムを実現した上で、実行時に「メソッドなしエラー」を出さないために必要。

  • OKWavex
  • ベストアンサー率22% (1222/5383)
回答No.1

いらないならひつようないよ