加茂です.
またわけのわからないことを….
読んでる人に悪い影響が出ないように補足しておきます.
インタフェース継承で多重継承しても大きな問題が出ることはありません.
シグネチャの衝突の問題の件が出ていますが,問題の検出,理解,対策とも容易で
頻度の高い問題ではないので大きな問題ではないのです.
もしインタフェース継承での多重継承時にシグネチャ衝突してしまったときに
それが菱形継承(親インタフェースを共有している多重継承)で衝突している場合は
何も問題はありません.
もともと親インタフェースで定義した同じメソッドなのですから,
そのメソッドの責任は同じはずです.
菱形継承でなく,別々の継承ツリーからの多重継承
(親インタフェースを共有していない多重継承)
でシグネチャが衝突してしまった場合は
衝突したメソッドとそれに関連するメソッドだけ取り出したインタフェースを作り,
もともとのインタフェースとは別の継承ツリーに切り出せないか考えてみてください.
これができれば衝突は解消されます.
別の継承ツリーに切り出すよりも,元のインタフェースの
親インタフェースにした方がよい場合は,
切り出したインタフェースをスーパーインタフェースにして
菱形継承の形にしてもよいでしょう.
これが適切でない場合は,そのシグネチャが本当にメソッドの責任を
適切に表せていたかどうかを考えてみてください.
ひとつのプロジェクト内で,多重継承しようと考えている
二つのインタフェースが同じシグネチャで
別の責任を持つような設計がされているのは正常とは考えにくいです.
メソッド名をもう少し説明的にして
よりメソッドの責任が明確になるようにしましょう.
どうしても同じシグネチャのままにしたいという場合は,
純粋な多重継承をあきらめることになります.
この場合例えば,先の例で出しましたが,
シグネチャの衝突が起こらない範囲で継承元を選び,
継承元にできなかったインタフェースは as〜() という
メソッドを用意して必ずそのインタフェースとしての
責任も満たさせるような構造をもたせます.
このように設計すれば呼び出し側から継承元のインタフェースで
宣言されたメソッドもas〜()というメソッドを経由して取得するインタフェースで
宣言されたメソッドも実装を意識することなく呼び出せます.
インタフェース継承での多重継承は,クラスの責任が明確になり,
呼び出し側のクラスと呼び出し元のクラスの結びつきをゆるくするために
非常に有用な(静的な)オブジェクト指向の考え方・機能です.
JDKのAPIやApache JakartaやEclipseなどのソースやJavadocを見てみてください.
多くのクラスが複数のインタフェースをimplementsしています.
こうした形のインタフェースの設計がJava周りでのオブジェクト指向設計の肝です.
以上
---
加茂 昌彦 (KAMO Masahiko)
*****@**.*******.***
富士通株式会社 ソフトウェア事業本部
開発企画統括部 MDA技術プロジェクト
内線: 7128-3218
外線: 045-476-5146
http://www.mda.css.fujitsu.com/
-------------------------------------
オブジェクトの広場
http://www.ogis-ri.co.jp/otc/hiroba/