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

你的班级结构很混乱。您在遗留代码中是否有无法更改 parent 的内容?如果不改变它:-)

于 2012-08-22T17:42:57.440 回答
0

在构造函数中调用抽象方法是一个糟糕的设计。某些工具(如 PMD)默认将其指示为警告(甚至可能是错误)。所以我认为很难在这里谈论任何模式。我要做的是如下实现 Bar 类。

public class Bar extends Foo{

    private int aValue;
    private boolean initialized = false;


    public Bar(int aValue){
        this.aValue = aValue;
        initialized = true;
        register();
    }

    public void register(){
       if (initialized)
       aMethod(aValue);
    }


}
于 2012-08-22T17:51:57.433 回答