我正在尝试在Java中创建一个抽象类,其中一部分创建涉及调用子类需要实现的初始化方法。我希望子类可以访问任意参数,但是,抽象类不需要知道。
这里有一些代码可以让它更清晰:
public abstract class NormalizedRandom<T> {
private Queue<T> randomList;
private List<T> usedRandomsList;
public NormalizedRandom() {
randomList = new LinkedList<T>();
usedRandomsList = new ArrayList<T>();
init();
shuffleList();
}
protected abstract void init();
...
}
和
public class NormalizedRandomIntegerRange extends NormalizedRandom<Integer> {
private int min;
private int max;
private int repeats;
public NormalizedRandomIntegerRange(int min, int max, int repeats) {
this.min = min;
this.max = max;
this.repeats = repeats;
}
@Override
protected void init() {
for(int num = min; num <= max; num++) {
for(int i = 0; i < repeats; i++) {
super.addRandomOutcome(num);
}
}
}
}
显然这不会起作用,因为在初始化参数之前需要调用super()。
这类问题看起来必须有一些简单的设计模式来解决它。我想不出正确的解决方法。
答案 0 :(得分:1)
尝试将初始化推广到自己的类或接口中 子类必须提供超类作为构造函数的参数。 现在您可以轻松切换和重新定义init方法和 超类可以在子类代码运行之前调用它。 可以使用参数初始化initStrategy,这些参数是未知的 超类。我会用一个界面。 (我想你已经知道了,但这是一种策略模式)。
希望这有帮助,史蒂夫。
答案 1 :(得分:0)
我认为你可以使用'Builder',它是用来避免拥有许多不同构造函数的创建模式。 我的意思是从对象中初始化对象。为此目的使用Builder类。