2012-04-25 23 views
1

私はJavaを使い慣れていませんが、OOPプログラミングに慣れています。私は以下のコードのように別の抽象クラスにネストされた抽象クラスを実装する強制することができますが方法である:Javaの抽象クラスでネストされた抽象クラスの実装を強制するには?

public abstract class A 
{ 

    public abstract class B extends C 
    { 
     @Override 
     public abstract void foo(); 

    } 

} 

私はBがAの各サブクラスで実装するしたいと思いますが、それは可能ですか? When an Abstract Class Implements an Interfaceに示すように

は、あなたの助けのために

+0

AのすべてのサブクラスにBを実装するネストされたクラスが含まれていることを強制したいですか?純粋なJavaの手段では不可能です。 –

+0

あなたは、Aの各サブクラスをBのサブクラスにするか、またはBのサブクラスを含むことを希望していますか? –

+0

ここで実際の解決策は、AをCに拡張することだと思います。Aのサブクラスが別のサブクラスを介してCを実装することを選択すると、それがサブクラスの選択になります。 –

答えて

2

をありがとうはい、Bインタフェースを作ります。

+0

私はこれが質問に答えるとは思わない。 Bが抽象クラスであれインタフェースであれ、どんなものであれ、Aを具体的なクラスに完全に拡張できます。 –

+0

良い点ですが、コンパイラが実行できるように 'A'から派生したときに' foo() 'の実装を延期する方法についての質問を理解しました。そうでなければ、それは可能ではないようです。当然、私は反例を歓迎するだろう。 – trashgod

+0

私の答えは可能性を提供すると信じています。私はそれが良いデザインだと言っているわけではありませんが、Aの各サブクラスがBのサブクラスにアクセスすることを強制します。 –

0

これはできません。 Aクラスは、(抽象メソッドまたは実装されたメソッドのいずれかを介して)Aのインスタンスが持つ動作のみを提供する必要があります。 Aの実装方法について何も述べるべきではありません。

これは、実装されたクラスBを呼び出すことができなかったために、どのように役立つのかはっきりしていません。

5

質問を正しく読んで、Aの各サブクラスにBのサブクラスを入れたい場合は、これを直接行う方法はありません。これはBのインスタンスを返すために、Aのサブクラスを強制しているので、彼らは、しかしB.

のいくつかのサブクラスへのアクセス権を持っている必要があります

public abstract class A 
{ 

    public abstract class B extends C 
    { 
     @Override 
     public abstract void foo(); 
    } 

    protected abstract B getBInstance(); 
} 

:しかし、あなたは以下のような何かを行うことができますAがBを何らかの方法で使用して上記を必要とする場合を除いて、AがBを実装するサブクラスについて気にする必要があるのはあなた自身に尋ねてください。

+1

+1貴重な警告です。 – trashgod