- ベストアンサー
インターフェイスについて
いつも楽しく拝見させて頂いています。 まだ開発経験は浅いですが宜しくお願いします。 インターフェイスについてですが、私にはインターフェイスを使うメリット、又どういうときにインターフェイスを作るべきなのかがよくわかりません。google等で調べてもそういう類のことは発見できませんでした。 どうかご教授宜しくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
インターフェイスは、クラスの継承構造と機能の継承構造を独立させるためにも使えます。 たとえば、あなたが動物たちを使って軍隊を作るとします。 そして、水中で長時間活動できる部隊が必要になったとします。 その部隊に入隊できる条件を「魚類であること」としたら、魚が集まりますね。 魚はみんな水中で活動ができますから活動に問題はありません。 しかし水中で活動ができる生き物は、イルカ、クジラ、アザラシ、ペンギン、アクアラングを背負った人間などもいます。 彼らはほ乳類、鳥類ですので、条件を彼らを包含する「脊椎動物であること」にしてみますか? もちろんそれでは泳げない動物もたくさん含まれますので目的は果たせません(ネコには無理な相談です!)。 そこで条件を素直に「水中で長時間活動できること」にします。 これならOKですよね? ここで上記の例えをオブジェクト指向に置き換えると、 脊椎動物、魚類、ほ乳類、イルカなど:クラス 水中で長時間活動できる:インターフェイス 部隊に入隊できる条件:メソッドの引数や変数が要求するインスタンスの型 となります。 あるメソッドが引数としてオブジェクトを要求するとき、クラスを指定すればそのクラスとその子孫を受け取ることができますが、それ以外のクラスは受け取れません。 本当にそのクラスを必要としているなら良いのですが、クラスではなく機能(メソッド)を必要としている場合は、困ります。 クラスの継承ツリー上のバラバラの場所でその機能が実現されている場合、それらをクラスでは指定できないからです。 こういう場合にインターフェイスを使います。 必要な機能(メソッド)をインターフェイスで定義し、クラスへのインターフェイスの実装という形で機能を実現(実装)します。 そして、あるメソッドが引数としてオブジェクトを要求するとき、クラス名を指定する代わりにインターフェイス名を指定すれば、機能を実現しているクラスは全て受け取ることができるようになります。 このとき、そのクラスがクラスの継承ツリー上のどこにあってもかまわない事に大きな意義があります。 クラスの継承ツリーの構造から来る制約を受けずにクラスに必要な機能を指定できています。 機能の定義をクラスの継承ツリーから分離させているということです。 この時重要なのは、クラスの設計がきちんとできているかどうかです。 クラス間の関係は色々なものがあるのですが、目的に合わせて継承以外の色々な手法を使う必要があります。 これがきちんとできていないとオブジェクト指向の美味しい所を享受できなくなり、「オブジェクト指向って、面倒で重いだけのもの」になってしまいます。 私も最初はインターフェイスの意義が全く見いだせなかったのですが、デザインパターンやDIを勉強してやっと理解できました。 そちらの方も勉強されることをオススメします。
その他の回答 (2)
インターフェイスの利点の1つは、「メソッドの存在が保証される」ということです。例えば、いくつかの種類のクラスを作るのだけど、それらには必ずAというメソッドがないといけない、というような場合、インターフェイスを定義してAを用意しておき、作成するクラスはすべてこのインターフェイスをimplementsするようにしておくわけです。 例えば、インターフェイスはイベント処理などで多用されていますね。ボタンのアクションを処理する場合には、ActionListenerをimplementsしたクラスを用意し、そこにあるactionPerformedに処理を書きますね。 このボタンのクラスの中ではどういうことが行なわれているかというと、アクションイベント発生時に、addActionListenerされたクラスのactionPerformedを呼び出すような仕組みがあらかじめボタンのクラス内に組み込まれているわけです。ここで、「もし、そのクラスの中にactionPerformedメソッドがなかったらどうなるか?」を想像してみてください。そんなことがあると、このイベント処理の仕組み自体がなりたたなくなってしまいます。 が、実際にはそんな心配はありません。なぜなら、インターフェイスを使えば、そこに「必ずこのメソッドが存在する」ことが保証されているからです。メソッドがない、ということはありえないのです。だから、ボタンのクラスでは、安心して「そこに必ずactionPerformedメソッドがある」ものとしてプログラムを用意しておくことができます。これは、たとえ「まだActionListenerのクラスが存在していない」としても、です。つまり、インターフェイスが定義されていれば、実際にそれを実装したクラスがまだ存在していなくとも、「それがある」ものとしてプログラムを完成できるのです。 このように、あらかじめ「ここで使うこのクラスには、必ず○○というメソッドが存在するんだ」という前提でプログラムを用意しておくことができる、これがインターフェイスを使う最大のメリットでしょう。同様のことは抽象クラスでもできますが、この場合、必ず抽象クラスを継承して使わないといけません。インターフェイスならば、他のクラスを継承したクラスにも組み込めますし、同時に複数のインターフェイスを組み込むこともできます。 他にも、クラスの結合を粗にするとか、いろいろと利点はありますが、そのあたりはだいぶJavaになれてこないとちょっとわかりにくいかも知れません。
ひとついえることは 定数の利用です。 パブリックで変更できない 安全な定数。 また、名前で利用できるので使いやすい。 その他にもメリットたくさんあります。