JAVAを勉強している者です。説明が下手ですいませんが、「インターフェース」って一体なんなんでしょうか?
ネットや参考書みても「特に抽象度(派生させて目的に応じた機能を実装させることを前提として設計した)が高い抽象クラス」と書いてあるんですが、なんなのかよくわかりません。
私はまだ勉強不足だと思いますが、インターフェースっていうのは、「何かと何かを繋ぐ」という意味でしょうが、「特に抽象度が高い抽象クラス」と、「何かと何かを繋ぐ」というのは何か関係あるのですか?
わかりやすいような例や例えで教えてくれませんか?
できれば身近な例を挙げて教えてくれませんか?
よろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答6件
0
ベストアンサー
以前どこかで見たたとえで分かりやすいものとしてはUSBポートでしょうか。
USBポートにつなぐものは様々な種類のデバイスがあります。
マウス、キーボード、外付けHDDなど、機能も役割もバラバラです。
しかし、USBという統一されたインタフェースのおかげで、みんな基本的に差し込むことで使うことができます。
抽象度を上げる、つまり実体を気にしなくて済むようにすることで、みんな統一して使うことができるのです。
投稿2017/01/08 15:36
総合スコア20675
0
抽象クラスについても質問されておられましたが、インタフェースもこれと同じ目的のものです。インタフェースも直接インスタンスを作ることができません。インタフェースを引き継いだクラスを作る際は、「継承」ではなく「実装」という言葉を使います。
javaにおいては多クラスの継承は禁止されています。一方で多インタフェースの実装は可能です。
ちなみに、どうやらオブジェクト指向について勉強されておるようですが、これは実践的なプログラミングをしないことには利益がわかりづらいものだと思いますよ。「意図的な機能制限」についての有用性はデバッグとかを通じたほうがわかりやすいです。
投稿2017/01/08 23:26
総合スコア4853
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
Javaのインターフェイスは、Javaでは一つしか親クラスを持てないために、親クラスにしか、成り済ます(=ポリモーフィズム)ことが出来ないという問題を避けるための仮のクラスです。(実際には無いクラスなので、抽象的だとかそういう言葉が使われます。)
継承関係が直接ない2つのクラスが、同じ引数を持つ同じ名前のメソッドを持つことを保証することで、どちらのクラスもインターフェイスクラスに成り済ます(=ポリモーフィズム)ことができます。(本質的には、意味上の振る舞いも同じでないと困るのですが、現時点では理解するのは難しいと思います。)
厳密にどういった意味合いでインターフェイスと名付けられたか解りませんが、私はインターフェイスクラスで定義したクラスの仕様に他のクラスが合わせて繋げることができる点がインターフェイスという言葉にしっくり来ます。
実際のところは、サンプルコードを見て理解した方がわかりやすいと思います。
(サンプルコード読んだけどよくわからないという質問の方が説明し易いです。)
投稿2017/01/08 18:43
総合スコア2884
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
Javaにおけるインターフェイスは、特定の動作を行うために、メソッドの書き方を定義するものです。
例えばJavaからデータベースを利用したいとき、
「もしJavaからSQLクエリを発行したいのなら、こんなメソッドを用意しておいてね」
という決まりを決めておけば、利用するDBがなんであれ、同じ名前のメソッドに同じように値を入れれば、あとはそれぞれのDBに対応したインターフェイスがDBを操作してくれます。
身近な例でいえば、GUIとかでしょうか。
Graphical User Interfaceは、プログラムを視覚的に利用できるようにするための、ユーザとプログラムの間にある面、です。
GUIは、「ボタンとかを用意して、クリックすればプログラムの機能を利用できるようにしたもの」ですよね。
コマンドとか知らなくても、マウスでべちべちとアイコンやボタンをクリックしていけばプログラムを利用できます。
つまり、Javaに限った話なら、
特定の動作を行うメソッドの作り方を決めておくことで、その面(インターフェイス)の向こう側を気にしなくてもいい(こっち側だけ変えればいい)ようにするもの
IT用語としては、
利用者がその中身を気にしなくても利用できるようにするための面
ということになるかと思います。
もしよかったら、以下も読んでみてください(検索してすぐに出てくるものですが)。
http://www.gixo.jp/blog/5159
ちなみに英単語としてのInterfaceの語源は、
- Inter: 間、Face: 面
よって、Interface=間の面、つまり何かと何かの間を取り持つ面、になります。
僕もはじめ「何かと何かをつなぐ」という認識でしたが、「~ために間にある面」という認識のほうがいい気がしてきました。
どうでもいいですけど、この単語ほどカナ表記が不定な単語ってないですよね…
インターフェースとかインタフェースとかインターフェイスとか。。。
Internetはインターネット、Facebookはフェイスブックなので、僕はインターフェイスと書きますが。
投稿2017/01/11 07:15
編集2017/01/11 07:17総合スコア50
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
デザインパターンをやってみてください。
時に Factory系 ( FactoryMethodパターン, Factoryパターン, AbstractFactoryパターン )。
インターフェースは、指定されたメソッドがあることを保障するものです。
( 私は C/C++ でやっていて、Javaはあまりやっていないので書き方が微妙ですが... )
たとえば、
Java
1public interface Keisan{ 2 double calc( double a, double b ); 3}
とあったら、このKeisanインターフェースを継承しているクラスは calcメソッドを定義する必要があります。
言い換えれば、このKeisanインターフェースを継承している子クラスは calcメソッドは必ずある。
ということです。
これを実装して、足し算クラス, 引き算クラス, 掛け算クラス を生成してみましょうか。
Java
1public class Tashizan implements Keisan{ 2 public double calc( double a, double b ){ return a + b; } 3} 4 5 6public class Hikizan implements Keisan{ 7 public double calc( double a, double b ){ return a - b; } 8} 9 10 11public class Kakezan implements Keisan{ 12 public double calc( double a, double b ){ return a * b; } 13} 14
ここまでだと理解しづらいですが、ここからです。
じゃあ、簡易的な計算プログラムをつくってみましょうか。
mainメソッド等は省きます。( 例なので。 )
ユーザ入力の値によって行う計算を変えるします。
1 : 足し算, 2 : 引き算, 3 : 掛け算
とします。
ですが、ここで問題があります。
ユーザが入力されるまでどのクラスを生成するのかわかりませんね。
ですが、 Java の場合、型を定義しないといけません。
JavaScript みたいに
JavaScript
1var v; 2v = 100; 3v = "文字列";
のようになんでも入れられるっていうわけではないのです。
では どうするか。
インターフェース型としておきましょう。
インターフェースで ( new で ) インスタンス化することは不可能ですが。
型とするならOKなのです。
すると、
Java
1// mainメソッド内として。 2Keisan keisan; 3int cmd; 4double ans; 5 6// ここでユーザ入力を受け付ける ( int cmd に格納。 ) 7 8if( cmd == 1 ){ 9 keisan = new Tashizan(); 10}else if( cmd == 2 ){ 11 keisan = new Hikizan(); 12}else if( cmd == 3 ){ 13 keisan = new Kakezan(); 14} 15 16ans = keisan.calc( 20, 3 ); 17 18System.out.println( ans );
という風にできます。
で? と思いますよね?
よーく見てください。
ans = keisan.calc( 20, 3 );
とありますね。
インターフェース型として受け取っているので、インターフェースで指定されているcalcメソッドが保障されているので 使うことができるのです。
ですが、このままでは子クラス独自のメソッドは使えません。
この場合はキャストする必要があるようです。
投稿2017/01/10 03:45
総合スコア4962
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
A.javaというインターフェースとB.java C.java というクラスがあり、B.java C.javaはA.javaを実装しているとします
B.java C.javaをインスタンス化するには、
B b = new B();
C c = new C();
という風にクラス名の型でインスタンス化することもできますが
A b = new B();
A c = new C();
という風に実装しているインターフェースの型でもインスタンス化することができます
これを使うと
A[] a = new a[2];
a[0] = new B();
a[1] = new C();
a[0].メソッド名;
a[1].メソッド名;
という風に同じクラスのオブジェクトのように使うことができるので、これを繋ぐということだと理解しています
投稿2017/01/11 14:41
総合スコア52
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。