2016-11-06 8 views
3

ショートバージョンを拡張しますクラス(以下のコードは、このポストの目的のためだけに短縮されています)Javaのジェネリッククラスは、ジェネリック引数に

abstract class D { 
    abstract void f(); 
    abstract void g(); 
} 

次に、各f()と各g()の可能な組み合わせのセットがあります。目標はすべての可能な組み合わせを持つことです。

解決策の1つは、Dを拡張してf_j()を実装するクラスFjを作成し、各g_i()に対してFjを拡張しg_i()を実装するクラスGiFjを作成することです。 例

abstract class F1 extends D { 
    @Override 
    void f() { /* F1 Work */ } 
} 
abstract class F2 extends D { 
    @Override 
    void f() { /* F2 Work */ } 
} 
class G1F1 extends F1 { 
    @Override 
    void g() { /* G1 Work */ } 
} 
class G1F2 extends F2 { 
    @Override 
    void g() { /* G1 Work : Duplicated Code */ } 
} 

についての問題は、GIのコードが何度も重複して取得しようとしていることです。

私が実装するソリューションは、一般的なクラスの

class G1<F extends D> extends F { 
    @Override 
    void g() { /* G1 work */ } 
} 

にすべてのGFIを再グループ化することで、どのようにJavaでこれを行うために、あるいはそれが不可能であれば、それを

を行うための良い方法は何ですか
+0

残念ながら、Javaではサポートされていないクラスの複数の継承が必要なようです。 [mixin](http://stackoverflow.com/questions/587458/implement-mixin-in-java)戦略の使用を見てください。 – pathfinderelite

答えて

1

これはJavaでは不可能です。コンパイラはコンパイル時にクラスのスーパークラスが持つメソッドとフィールドを知る必要があります。したがって、クラスは(型変数で可能な)具象クラスを拡張することしかできませんが、型変数をそれ自身で拡張することはできません。あなたは何をしたいの並べ替えを達成するために組成物を使用することができます(表面上に短いバージョンとは無関係であると思われる)ロングバージョン

回答:

class Foo { 
    final FDelegate fDelegate; 
    final GDelegate gDelegate; 

    Foo(FDelegate fDelegate, Delegate gDelegate) { 
     this.fDelegate = fDelegate; 
     this.gDelegate = gDelegate; 
    } 

    void f() { 
     fDelegate.f(this); 
    } 

    void g() { 
     gDelegate.g(this); 
    } 
} 

interface FDelegate { 
    void f(Foo container); 
} 
interface GDelegate { 
    void g(Foo container); 
} 

次に、あなたが持っていますクラスF1,F2,G1,G2であり、これらは様々な方法の実装を含む。 Fooオブジェクトを渡して、(可視の)メンバーにアクセスできるようにします。

関連する問題