私はクラスが同じデフォルトデフォルトメソッドを持つ複数のインターフェースを実装しています。私はどのようにすべてのインターフェイスからデフォルトメソッドを合成することができますかと思います。例えば、Java 8:複数のインターフェースのデフォルトメソッドを自動的に合成する
interface IA {
default void doA() {}
default void process() {
// do something
}
}
interface IB {
default void doB() {}
default void process() {
// do something
}
}
interface IC {
default void doC() {}
default void process() {
// do something
}
}
// other similar interfaces
....
class MyClass implements IA, IB, IC, ... {
public void process() {
// question: how to avoid iterate all the interfaces?
IA.super.process();
IB.super.process();
IC.super.process();
...
}
}
class AnotherClass implements IA, ID, IF, IH, ... {
public void process() {
IA.super.process();
ID.super.process();
IF.super.process();
IH.super.process();
...
}
}
実装では、この方法はすべてのインターフェイスから単純にprocess()
を合成するだけです。しかし、IA.super.process()
、IB.super.process()
、IC.super.process()
を明示的に呼び出す必要があります。インタフェースリストが長い場合は、それらのすべてを書くのは辛いことです。また、異なるインターフェースの組み合わせを実装するために、異なるクラスを持つこともできます。私はそれを自動的に行うことができる他の構文の砂糖/デザインパターン/ライブラリはありますか?
更新:
複合パターンもかなりされた複合パターンと比較します。しかし、コンポジットパターンは私にここで静的な型チェックを与えませんが、私はクラスを別の振る舞いを与えるためにmixinとしてデフォルトメソッドを使用したいと思います。コンポジット・パターンは、余分なメモリー・フットプリントも導入します。
デフォルトを使用する必要ですか?インターフェイスを変更できますか? – Michael
IA、IBなどがプロセッサを拡張するリストに*クラスを委任してはいけないと確信していますか?その後、ループを使用するだけです。 –
Javaに自動的にこれをさせる簡単な方法はありません。おそらくこれをリフレクションで行うことができます(クラスが実装するインターフェイスを確認し、それぞれのプロセスのメソッドをリフレクションで呼び出す)が、これは複雑で厄介なことになります。異なる、より良いアプローチがあり、他の人たちが提案しているものを参照してください。 – Jesper