Java : Mixin(多重継承)とかパーシャルクラスとか(2)
「ダウンキャスト」と「インターフェースの一部だけをMix-inが実装している場合」について、どうすればいいのかを解説。
ダウンキャスト
コンポジションMixinは当然abstract classなので、次のようにかけば、baseフィールドから元インスタンスにアクセスできます。
abstract class Mixin { final Object base; Mixin(Object base) { this.base = base;} abstract int mustOverride(); int mult() { return 2*mustOverride();} } class SomeObject { final Mixin mixin = new Mixin(this) { int mustOverride() { return 1;} }; }
インターフェースの一部だけをMix-inが実装している場合
無名クラスではなく、内部クラスを使えばよいのではないかと思います。
interface A { void methodA(); } interface B extends A { void methodB(); } abstract class mixinA implements A { public abstract void mustOverride(); public void methodA() { mustOverride();} } class SomeObject { int field = 0; final InnerB mixin = new InnerB(); class InnerB extends mixinA implements B { public void mustOverride() { ++field;} public void methodB() { field = field * field;} } }
ただし、複数の実装を継承するようなケース(複数のMixinを組み合わせて1つのインターフェースを実装する)場合には、委譲コードを排除することは不可能です。
でも、ここまでで紹介しているテクニックに収まらないようなケースって、設計に問題があるような気がしますが。(外部からインターフェースが与えられていて、かつ、設計に問題があるというケースが、現実には珍しくないというのは理解していますけどね。)だから、Javaではこういう書き方をするんだということを理解して設計するのがよいのではないかと思います。