2009-08-11 12 views
1

このようなことは、Javaではまったく意味がありますか?Javaで汎用クラスのパラメータを拡張することはできますか?

class A<T extends B> extends T{ 
    int fun1() { 
    .... 
    }  
} 

abstract class B extends X implements C { 

} 

interface C { 
    int fun1(); 
} 

クラスBがXとCの両方を理想的に拡張したいと考えています。しかし、Javaには多重継承がないので、私はより滑らかな回避策を考え出しています。

Cで定義されるものは、代わりにスーパークラス "A"で定義されているということです。問題は「拡張」の後にジェネリックタイプを使用させることです。

考えますか?

+2

実際の問題について詳しく説明できますか?私は本当に複数の継承が必要な状況には入らなかった。これは、異なる方法で解決できる設計上の問題かもしれません。あなたのソリューションはやや複雑に見えます。 – Juri

+0

私はまた、このようなクラスの「テンプレート化」はC++のようにjavaで動作しないと付け加えます。 – Chii

答えて

1

他の人は言っているように、ジェネリックスは実装の多重継承には役に立ちません。

複数の継承のために自分自身を繰り返さないようにするには、通常、スーパークラスの静的メソッドに共通の実装を記述し、必要な場所からその実装に委譲します。

最も簡単な例は次のようになります:この例には示されていないBおよびAからDによって継承複数の操作が存在するであろう、これは有用にする

class A 
{ 
} 

class B extends A 
{ 
} 

interface C 
{ 
    void foo(); 
} 

class CBase extends A implements C 
{ 
    public void foo() 
    { 
     sFoo(this); 
    } 

    static void sFoo(C c) 
    { 
     // Implement foo here 
    } 
} 

class D extends B implements C 
{ 
    public void foo() 
    { 
     CBase.sFoo(this); 
    } 
} 

注意。

4

いいえ、それは私が怖い代替デザインパターンをお勧めするのは非常に難しいですが、種類がA、B、CまたはXが何であるかを知らないタイプのパラメータ

として指定されたクラスを拡張することはできません。

2

あなたがしようとしていることは動作しません - Javaジェネリックスは継承とは関係ありません。

複数のインターフェイスを宣言し、集約を使用して複数の継承を "偽造"することができます。

0

typeパラメータは、コンパイル時のみのジェネリックのプレースホルダであり、実際の型です。

それをサポートしていない言語での複数継承の回避策を考え出すのはおそらく、その欠陥が設計上のものであることを示す良い指標です。 <T extends B>は、Tのタイプがで、Bであることを意味しています。<T extends B>は、と言っても意味がありません。 がそのクラスに定義されていないため、extends Tを追加することは何も意味しません。この場合も、これはコンパイル時の型です。実際の型のTは実行時には直接利用できません。

あなたは本当に、組成物ではなく、複数の継承によって最も適切に達成されていることは確かですか?また、Aにあまりにも多くのことをやろうとしている可能性もあります。

より具体的な例では、他の人がデザイン自体についてより多くのフィードバックを与えることができます。

関連する問題