java言語のインターフェースの存在意義について以前より少しだけ理解が進んだようなのでまとめておく。コーディング規約の強制を実現するあるシステム開発現場では、作成される各クラス毎に、必ず実装する必要の有る共通メソッド(methA,methB,methC)が定められていたとする。その場合、上記のメソッド(methA,methB,methC)をインターフェースとして宣言する。methC();}こんな感じ。それぞれの開発者がクラスを設計する際には、必ず上記のインターフェース(Zettai_iru)をインプリメントする事をルールとして徹底することで、コンパイルエラーという形でメソッド(methA,methB,methC)の実装もれが未然に検知できる。{...}}上記のクラス定義(Hoge)はmethCが実装されていないのでコンパイル時にエラーとなる。{...}}それが別のクラス(Foo)のメソッド(meth)の引数になっていて、methの内部ではクラスBooのメソッドの内、meth_nandaとmeth_kandaを利用したコーディングが行われているとする。{boo.meth_nanda()を使ったなんらかの処理;boo.meth_kanda()を使ったなんらかの処理;}}メインでは以下のように呼ばれるだろう。Boo();foo.meth(boo);}}ここまでは、特に問題は無い。ここでクラスBooによく似た別のクラス(Bar)についてもクラスFooのメソッドmethで処理したい要件が発生したとする。クラスBarはクラスBooとよく似ているのでメソッドmeth_nanda,meth_kanda,meth_hogeは実装されている。クラスFooのメソッドmethの引数の型はBoo型と定義されているので、Bar型のオブジェクトを引数として渡すことはできない。よって、これを解決するために、クラスFooの中にBar型のオブジェクトを引数としてメソッドmethと同様の処理を行う別のメソッド(meth_for_bar)を定義した。{bar.meth_nanda()を使ったなんらかの処理;bar.meth_kanda()を使ったなんらかの処理;}}これで一件落着...本当に?ここで、クラスFooのメソッドmethとmeth_for_barは引数の型が異なるだけで、ロジックそのものはほとんどコピペされている。今後、さらにBoo似のクラスが出て来たら同様の手法でmeth_for_xxxがどんどん増えていってしまいそうである。メソッドmethの仕様変更が発生した場合にはそれぞれのmeth_for_xxx達にも同じ修正を繰り返し施す必要が出てくるのは間違い無い。これは是非避けたいそこでインタフェースの登場となる。クラスFooのメソッドmeth(,meth_for_bar)の引数となるクラスで定義されたメソッドの内、メソッドmeth(,meth_for_bar)内で利用されるメソッド(meth_nanda,meth_kanda)をまとめてインタフェースとして宣言する。meth_kanda();}クラスBoo,BarではインターフェースKoreha_iruをインプリメントする。{...}}クラスFooのメソッドmethの引数をインターフェース(Koreha_iru)型とする。{ki.meth_nanda()を使ったなんらかの処理;ki.meth_kanda()を使ったなんらかの処理;}}すると、メインでは以下のように呼び出すことができる。Bar();foo.meth(bar);}}このように、実質的にクラスFooのメソッドmethでBoo型、Bar型両方のオブジェクトを引数として処理できることとなり、冗長なメソッドmeth_for_barは必要無くなる。ある意味では多重継承クラスはインターフェースをインプリメントすることによって、インターフェースで宣言されたメソッドの実装を強制される(実装しないとコンパイルエラーになる)。これは見方を変えれば、あるメソッドを持つという性質のみ(これらはインターフェースで宣言されたもの)を継承していると言える。クラスは複数のインターフェースをインプリメント出来るので、上述の「あるメソッドを持つという性質のみ」に関して言えば多重継承出来るのだとの解釈も大きく外れてはいないかもしれない。2.2.10-p489。