Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否有设计模式强制初始化子类实现的方法?_Java_Design Patterns - Fatal编程技术网

Java 是否有设计模式强制初始化子类实现的方法?

Java 是否有设计模式强制初始化子类实现的方法?,java,design-patterns,Java,Design Patterns,我试图在Java中创建一个抽象类,其创建的一部分涉及调用子类需要实现的初始化方法。但是,我希望子类能够访问抽象类不需要知道的任意参数 下面是一些代码,让您更清楚地了解: public abstract class NormalizedRandom<T> { private Queue<T> randomList; private List<T> usedRandomsList; public NormalizedRandom() {

我试图在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();

    ...

}
公共抽象类NormalizedRandom{
专用队列随机列表;
私有列表usedRandomsList;
公共规范化随机数(){
randomList=新的LinkedList();
usedRandomsList=newarraylist();
init();
shufflist();
}
受保护的抽象void init();
...
}

公共类normalizedRandomintegrange扩展NormalizedRandom{
私用int min;
私人int max;
私有int重复;
公共normalizedrandomintegrange(int-min、int-max、int-repeats){
this.min=min;
this.max=max;
this.repeats=重复;
}
@凌驾
受保护的void init(){

对于(int num=min;num我认为您可以使用“构建器”,这是一种用于避免使用许多不同构造函数的创造性模式。
我的意思是从构造函数中获得对象的初始化。为此,请使用生成器类。

尝试将初始化展开到自己的类或接口中,这样做 子类必须提供超类作为构造函数的参数。 现在您可以轻松地切换并重新定义init方法和 在子类代码运行之前,超类可以自己调用它。 initStrategy可以用参数初始化,这些参数从 超类。我会使用一个接口。 (我想你已经知道了,但这是一种战略模式)


希望这能有所帮助,Steve。

这正是我想要的解决方案。在仔细考虑之后,我意识到我在设计这个问题。层次结构实际上不需要那么灵活:我实际上只需要在子类构造函数中进行初始化,只需要重新定义呃,如果我以后再创建更多的子类,我就可以这样做。生成器的工作没有我希望的那么好,因为它为问题增加了一个额外的间接层。我希望子类能够直接定义其初始化,这是Jacksonf1建议的策略模式能够做到的。
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);
            }
        }
    }
}