2009-10-26 8 views
10

私はクラスAを持ち、サブクラスBを書きます。Aにはパラメータ化されたコンストラクタが1つしかありません。 BはAのこのスーパーコンストラクタを呼び出さなければなりません。 これでパラメータとしてObjectを使いたいと思います。このオブジェクトはBのメソッドを呼び出す必要があります。したがって、パラメータオブジェクトはBの参照を保持するか、内部クラスでなければなりません。私のようなコンストラクタを呼び出したいときスーパーコンストラクタを呼び出すときに "this"を参照していますか?

public B(){ 
    super.(new parameter(this)) 
} 

は今... Eclipseは言う:明示的

コンストラクタの呼び出し中に

は「この」や「スーパー」を参照することはできません私がこれを回避するために見るのは、「この」インスタンスをパラメータオブジェクトに注入するセットメソッドです。私はスーパークラスを編集したくないです。

この問題を回避する方法はありますか。

+0

あなたは何を言いますか? –

+11

タグJonathanを参照してください...そのJava – craftsman

答えて

17

コンパイラは実際にあなたがここの足で自分を撮影することを妨げています。 Bはスーパーコンストラクタを呼び出すまで完全には構築されていないので、これを(コンパイラが許可している場合)参照として渡し、Bのメソッドを呼び出した場合、Bは無効な状態になり、 (実際には、Aはまだ初期化されていませんし、オブジェクトを含めてチェーン上のクラスもありません)。

明らかな解決策は、Bの外部で機能を提供し、それをパラメータのコンストラクタに渡すことです。特定の問題は特定の問題に依存しますが、B内の静的なネストされたクラス(同じ理由で静的である必要があります - 内部クラスは外部クラスインスタンスへの暗黙の参照を持ちます)がその機能を提供する可能性があります。おそらく、パラメータBとそのスーパークラスの関係を再考する必要があります。それはすべて事件に依存する。

+0

私はそれを解決する方法を知っています。本当の問題は、スーパークラスが「古い」コードであることです。私は少し別の文脈でそれを再使用しています。私は洗練されたソリューションを探していました。しかし、私はないと思う。これは古いコードを再利用するための価格です。 –

+2

新しいクラスを古いものの周りにラッパーとして配置するだけで構いません。古いクラスは新しいオブジェクトで実装できるインターフェイスを実装していますか? – Joe

+1

@ c0d3xの場合は、ソリューションを(別の質問で)投稿し、より洗練されたソリューションがあるかどうか尋ねることができます。あなたの解決策を見ることは、関係する特定の事件に関する多くの質問に答えるでしょう。 – Yishai

関連する問題