0

子コンストラクターで取得された値が必要なため、そのコンストラクターで子クラスに挿入されたテンプレートメソッドを呼び出すマザークラスを拡張する子クラス。

親コンストラクターを変更せずに、このようなことを行うにはどうすればよいですか(Foo、ここ。実際のFooクラスでは変更できません)。

public abstract class Foo{
    public Foo(){
        register();
    }

    public abstract void register();

    public void aMethod(int aValue){
        // body
    }

}

public class Bar extends Foo{

    public Foo(int aValue){
        // body
    }

    register(){
        aMethod(aValue);
    }
}

ここでは、フィールドにaValueを入力しても、aValueは作成されません。

aMethod(aValue);.

どうすれば問題を解決できますか?

私はどんなパターン、ULM、解決策も探しています。

4

3 に答える 3

2

子コンストラクターで取得された値が必要なため、子クラスでインスタンス化されたテンプレート メソッドをそのコンストラクターで呼び出す、親クラスを拡張する子クラス。

サブクラスのコンストラクターが単純に値をスーパークラスのコンストラクターに渡さないのはなぜですか?

public abstract class Foo {
    protected Foo(int value) {
       ... use value ...
   }
}

public class Bar extends Foo {
    public Foo(int value) {
        super(value);
    }
    ...
}

サブクラスはまだそれ自体を初期化する機会がないため、コンストラクターで仮想メソッドを呼び出すことは危険な行為であることに注意してください。

于 2012-08-22T17:33:49.717 に答える
0

あなたのクラス構造はかなりめちゃくちゃです。親を変更できないレガシーコードにこれがありますか? 変更しない場合:-)

于 2012-08-22T17:42:57.440 に答える