No.3ベストアンサー
- 回答日時:
インターフェイスは、クラスの継承構造と機能の継承構造を独立させるためにも使えます。
たとえば、あなたが動物たちを使って軍隊を作るとします。
そして、水中で長時間活動できる部隊が必要になったとします。
その部隊に入隊できる条件を「魚類であること」としたら、魚が集まりますね。
魚はみんな水中で活動ができますから活動に問題はありません。
しかし水中で活動ができる生き物は、イルカ、クジラ、アザラシ、ペンギン、アクアラングを背負った人間などもいます。
彼らはほ乳類、鳥類ですので、条件を彼らを包含する「脊椎動物であること」にしてみますか?
もちろんそれでは泳げない動物もたくさん含まれますので目的は果たせません(ネコには無理な相談です!)。
そこで条件を素直に「水中で長時間活動できること」にします。
これならOKですよね?
ここで上記の例えをオブジェクト指向に置き換えると、
脊椎動物、魚類、ほ乳類、イルカなど:クラス
水中で長時間活動できる:インターフェイス
部隊に入隊できる条件:メソッドの引数や変数が要求するインスタンスの型
となります。
あるメソッドが引数としてオブジェクトを要求するとき、クラスを指定すればそのクラスとその子孫を受け取ることができますが、それ以外のクラスは受け取れません。
本当にそのクラスを必要としているなら良いのですが、クラスではなく機能(メソッド)を必要としている場合は、困ります。
クラスの継承ツリー上のバラバラの場所でその機能が実現されている場合、それらをクラスでは指定できないからです。
こういう場合にインターフェイスを使います。
必要な機能(メソッド)をインターフェイスで定義し、クラスへのインターフェイスの実装という形で機能を実現(実装)します。
そして、あるメソッドが引数としてオブジェクトを要求するとき、クラス名を指定する代わりにインターフェイス名を指定すれば、機能を実現しているクラスは全て受け取ることができるようになります。
このとき、そのクラスがクラスの継承ツリー上のどこにあってもかまわない事に大きな意義があります。
クラスの継承ツリーの構造から来る制約を受けずにクラスに必要な機能を指定できています。
機能の定義をクラスの継承ツリーから分離させているということです。
この時重要なのは、クラスの設計がきちんとできているかどうかです。
クラス間の関係は色々なものがあるのですが、目的に合わせて継承以外の色々な手法を使う必要があります。
これがきちんとできていないとオブジェクト指向の美味しい所を享受できなくなり、「オブジェクト指向って、面倒で重いだけのもの」になってしまいます。
私も最初はインターフェイスの意義が全く見いだせなかったのですが、デザインパターンやDIを勉強してやっと理解できました。
そちらの方も勉強されることをオススメします。
No.2
- 回答日時:
インターフェイスの利点の1つは、「メソッドの存在が保証される」ということです。
例えば、いくつかの種類のクラスを作るのだけど、それらには必ずAというメソッドがないといけない、というような場合、インターフェイスを定義してAを用意しておき、作成するクラスはすべてこのインターフェイスをimplementsするようにしておくわけです。例えば、インターフェイスはイベント処理などで多用されていますね。ボタンのアクションを処理する場合には、ActionListenerをimplementsしたクラスを用意し、そこにあるactionPerformedに処理を書きますね。
このボタンのクラスの中ではどういうことが行なわれているかというと、アクションイベント発生時に、addActionListenerされたクラスのactionPerformedを呼び出すような仕組みがあらかじめボタンのクラス内に組み込まれているわけです。ここで、「もし、そのクラスの中にactionPerformedメソッドがなかったらどうなるか?」を想像してみてください。そんなことがあると、このイベント処理の仕組み自体がなりたたなくなってしまいます。
が、実際にはそんな心配はありません。なぜなら、インターフェイスを使えば、そこに「必ずこのメソッドが存在する」ことが保証されているからです。メソッドがない、ということはありえないのです。だから、ボタンのクラスでは、安心して「そこに必ずactionPerformedメソッドがある」ものとしてプログラムを用意しておくことができます。これは、たとえ「まだActionListenerのクラスが存在していない」としても、です。つまり、インターフェイスが定義されていれば、実際にそれを実装したクラスがまだ存在していなくとも、「それがある」ものとしてプログラムを完成できるのです。
このように、あらかじめ「ここで使うこのクラスには、必ず○○というメソッドが存在するんだ」という前提でプログラムを用意しておくことができる、これがインターフェイスを使う最大のメリットでしょう。同様のことは抽象クラスでもできますが、この場合、必ず抽象クラスを継承して使わないといけません。インターフェイスならば、他のクラスを継承したクラスにも組み込めますし、同時に複数のインターフェイスを組み込むこともできます。
他にも、クラスの結合を粗にするとか、いろいろと利点はありますが、そのあたりはだいぶJavaになれてこないとちょっとわかりにくいかも知れません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(開発・運用・管理) PLCアダプター 4 2023/02/23 13:15
- 作詞・作曲 DTMとMIDIキーボードについて。 ハードオフでジャンク品のmidiキーボードを見つけました。Ro 1 2022/06/25 11:35
- ノートパソコン パソコン、周辺機器に詳しい方、教えてください 4 2022/07/23 13:31
- その他(パソコン・周辺機器) DTMとMIDIキーボードについて。 ハードオフでジャンク品のmidiキーボードを見つけました。Ro 1 2022/06/25 13:24
- 楽器・演奏 ギターやベースってインターフェイス使ったりやwebカメラがしっかりしてたらオンラインレッスンでも効果 1 2023/06/13 07:33
- Wi-Fi・無線LAN PCWi-Fiの設定方法がわからなくて困っています。 4 2022/12/28 18:30
- モニター・ディスプレイ 【ウルトラワイドモニター検討中】 2 2023/08/08 13:06
- ノートパソコン このスペックのpcどうですか? ExcelやネットサーフィンやYouTubeに使いたいのですが 【O 1 2022/07/28 22:16
- 画像編集・動画編集・音楽編集 老人も操作出来る様なデジタルフォトフレームを探してます 1 2023/07/25 19:40
- アプリ アンドロイドをつかっています。開発者向けオプションをこの前いじりました。オフにしたのですが、Goog 2 2023/05/22 23:05
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
(vba)他のアプリケーションの右...
-
「ラッパークラス」の存在意義...
-
ASP.NETでの共通コードの書き方...
-
メソッドの引数にクラス名を渡す
-
C#でインターフェースのプロパ...
-
バックグラウンドでキー監視
-
C++ヘッダの肥大化
-
【C#】抽象クラスでコンパイル...
-
抽象クラスをJUNITでテストする...
-
委譲って何ですか?
-
JAVAでCPUなどのシリアル番...
-
interface,extend,implementの...
-
List,LinkedListの関係
-
なぜインタフェースを使うのか?
-
肥大化した実装クラスを分割す...
-
ゲッターを使わないで変数にア...
-
【C#】クラスのコンストラクタ...
-
エクセルVBAで、条件に一致する...
-
「タイプ初期化子が例外をスロ...
-
変数名の付け方
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
interface,extend,implementの...
-
抽象クラスをJUNITでテストする...
-
(vba)他のアプリケーションの右...
-
VB DLLプロジェクトについて
-
サーバー上のフォルダ情報の取得
-
「ラッパークラス」の存在意義...
-
c++でのヘッダーファイルの循環...
-
ASP.NETでの共通コードの書き方...
-
compareToにおける「自然順序付...
-
ゲッターを使わないで変数にア...
-
委譲って何ですか?
-
「継承されたメソッドの可視性...
-
なぜForm型にキャストするので...
-
【C#】クラスのコンストラクタ...
-
VBがオブジェクト指向言語でな...
-
なぜインタフェースを使うのか?
-
インターフェース型の使い方が...
-
JavaにListElement型ってあるん...
-
メソッドの引数にクラス名を渡す
-
RPGゲーム オブジェクト指向
おすすめ情報