No.3ベストアンサー
- 回答日時:
システム開発でインターフェースを使うと便利なケースは、
例えばJavaのソフトを画面(GUI)チームと、機能チームに分かれていて、
画面チームが進行が早く、機能チームが遅れていた場合、
画面チームが画面のチェックをしようとしても
ボタンを押した時の処理は機能チームが作ってるとこなので、そのままではコンパイルが通らない。
そこでインターフェースとテスト用のクラス(実際はボタンを押しても何も起きないようにしたやつとか)を機能チームからもらっておき、
ボタンを押した場合は、それを使うように(つまりボタンを押しても何も起きないように)しておくと、
画面チームは画面のレイアウトなどのテストができる。
機能チームからちゃんとした機能が入ったクラスをもらえば、インスタンスの生成部分をテストクラスから本番用クラスに差し替えるだけでOK。
もしも機能の変更があっても、生成部分を別の変更後のクラスにすればそれでOK、となる。
これがインターフェースのメリットのひとつ。
>例えば、標準APIで示されているインターフェースっていうのは実態はどこにあるんですか?
大きく2種類あると思われます。
AWTやSwingのリスナーインターフェースは、実態(実装クラス)はなく、それを使うプログラマーに実装してもらう。
(アダプタクラスとかはある意味実態だけど、特殊なので省略)
もうひとつは、実装クラスはあるけど一般には使わない、インターフェースを使うというもの。
インターフェースのもうひとつの利点として、「実装は気にしなくてもいい」というのがある。
必要な機能の呼び出し方、つまりメソッド名と引数(シグネチャ)を知っていれば、
「実際にどう動くかは分からないけど呼べばちゃんと動く」という、カプセル化を活かしたものになってるわけです。
>それなら抽象クラスで同じ作用を代替させることもできるのでは。
抽象クラスでも問題ないけど、よくある「多重継承の問題」にぶち当たるので、インターフェースでないとまずいケースが多い。
というわけで、ざっと回答してみました。
分かりづらいところがあると思うので、そこは補足にでも入れてください。
この回答でよく分かりました。ありがとうございます。
確かに多重継承の問題は忘れていました。
また何か不明な点が出てきたら質問させていただきたいと思います。
No.2
- 回答日時:
すぐに業務で使うわけではないのであれば、
しばらく(50時間くらい)Javaの標準APIを使って趣味のプログラミングをしているだけでも、インターフェイスの意義がわかってきます。
つまりJavaの標準APIが、知らず知らずのうちにインターフェイスのお手本を示してくれます。
例えば、標準APIで示されているインターフェースっていうのは
実態はどこにあるんですか?
それはimplementsするクラスで実態を定義するということですよね。
どのボタン押したとかいうイベントを受け取るような
なんとかリスナーとかいうインターフェースは
プラットフォームに依存した特別なインターフェースなんですかね。
No.1
- 回答日時:
開発手法にも依りますが、僕の場合、まずインタフェースを定義してから実装することが多いです。
(すべてではないですが)インタフェースをimplementsするクラスは、インタフェースによって仕様が決められているため、実現方法や内部の状態について、これを利用する側に影響がすくないという利点があります。
たとえば、
interface Book{}
class Novel implements Book{}
class Comic implements Book{}
があり、これを利用するクラス
class Provider{}
は、Bookについて知りたいとき、Bookがどのような実装であれ、Providerはインタフェースが定めるBookの状態を知ることができます。
共同開発では、よくインターフェースを別のチームに提供する
という話があるようですが
まぁいうなれば窓口のような物ですよね。
例えば、銀行が各地の支店やコンビニにATMというインターフェースを提供しているというようなことですよね。
つまり
インターフェースの利点はクライアント側が
目的に対して、最も簡潔な利用手順さえ知っていれば
結果が得られるということなんでしょうか。
それなら抽象クラスで同じ作用を代替させることもできるのでは。
抽象クラスなら部分実装もできるし、インターフェースの存在価値が
またよく分からなくなってきます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- ネットワーク プロトコルの階層化とインターフェースとの違い 2 2022/07/26 02:38
- Java オブジェクト指向プログラミングの実践本を紹介してください 3 2022/09/19 04:56
- ソフトウェア データ入力のインターフェースについて 2 2022/09/27 09:07
- スピーカー・コンポ・ステレオ インターフェースに繋ぐモニタースピーカーでおすすめのものがあれば教えてください 1 2022/11/17 23:05
- スピーカー・コンポ・ステレオ インターフェースに繋ぐモニタースピーカーでおすすめのものがあれば教えてください 1 2022/11/18 08:21
- スピーカー・コンポ・ステレオ インターフェースに繋ぐモニタースピーカーでおすすめのものがあれば教えてください 1 2022/11/18 07:19
- システム 自社の外部接続システムと商用の外部接続サービスについて 1 2022/12/17 00:13
- その他(コンピューター・テクノロジー) 「プロトコル」の定義について 5 2023/04/16 13:13
- その他(パソコン・周辺機器) ユーザーインターフェースについての質問です。 3 2023/05/05 17:32
- Java javaのクラスの分け方について質問です。 APIの内部用と外部用でクラスを分けたいのですがインター 2 2022/04/26 16:06
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
オーバーライドとラッパーの違い
-
JTextFieldの入力制限
-
Javaのインスタンス化の構文の...
-
javaでクッキー認証を必要とす...
-
オブジェクト指向の特徴
-
JAVAでCPUなどのシリアル番...
-
抽象クラスをJUNITでテストする...
-
interface,extend,implementの...
-
interfaceとabstract
-
TableViewでタップした時にキー...
-
(vba)他のアプリケーションの右...
-
「タイプ初期化子が例外をスロ...
-
レコード件数の表示
-
変数名の付け方
-
サーブレットコンテキストの意...
-
パワーポイントのVBAでテキスト...
-
newしないインスタンス?実体化...
-
配列の重複する値とその個数を...
-
JAVAからHTMLへ値を返す方法
-
エクセルVBAで、条件に一致する...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
interface,extend,implementの...
-
(vba)他のアプリケーションの右...
-
抽象クラスをJUNITでテストする...
-
「ラッパークラス」の存在意義...
-
ASP.NETでの共通コードの書き方...
-
JTextFieldの入力制限
-
「継承されたメソッドの可視性...
-
VB DLLプロジェクトについて
-
C# 「データが失なわれる可能性...
-
c++でのヘッダーファイルの循環...
-
【C#】クラスのコンストラクタ...
-
「IOException は対応する try ...
-
メソッドの引数にクラス名を渡す
-
ファイルパスが取得出来ない(P...
-
ゲッターを使わないで変数にア...
-
Javaのインスタンス化の構文の...
-
オーバーライドとラッパーの違い
-
vb.net 自作プロパティの削除に...
-
なぜインタフェースを使うのか?
-
VBがオブジェクト指向言語でな...
おすすめ情報