使用不同参数列表进行继承

时间:2013-12-14 11:35:36

标签: java inheritance methods parameters subclass

我有一个基于checkers游戏的基类,我想将其子类化以实现不同的树搜索算法,minmax,alphabeta等。

所以我有类似

的东西
public class Checkers {
    ....
    public void findBestMove(Board b, int depth) {
        for(mv:b.possibleMoves()) {
        ...
           score = evalNode(b.domove(mv), depth + 1)
        ...
        }
    }

    int evalNode(Board b, depth) {<insert recursive node eval algorithm here>}
}

适用于minmax。 对于alphabeta,我需要更多参数:

    public void findBestMove(Board b, int depth) {
        for(mv:b.possibleMoves()) {
        ...
           score = evalNode(b.domove(mv), depth + 1, -9999999, -maxval)
           maxval = max(score, maxval)
        ...
        }
    }
    int evalNode(Board b, depth, alpha, beta) {<insert recursive node eval algorithm here>}

虽然findBestMove的基本逻辑对于所有树搜索方法都是相同的(生成所有可能的移动,尝试每个移动并将其传递给eval函数,返回最佳移动...),唯一的区别是调用评估函数,需要特定于算法的参数。

您能想到构建findBestMove方法的任何方法,以便我可以在所有子类中使用其基本逻辑(移动循环),但是具有不同的evalNode调用吗?在每个子类中重写它似乎是浪费。这只是我缺乏想象力还是这是不可能的?

1 个答案:

答案 0 :(得分:3)

一种方法是引入界面:

interface NodeEvaluator {
    int evalNode(Board b, depth);
}

并给它两个实现,其中第二个,将接受其他参数:

class MinMaxNodeEvaluator implements NodeEvaluator {
    public int evalNode(Board b, depth) {
        // evaluate node using min/max appproach
    }
}

class AlphaBetaNodeEvaluator implements NodeEvaluator {
    private int maxVal;

    public AlphaBetaNodeEvaluator()
    {
        this.maxVal = Integer.MAX_VALUE;
    }

    public int evalNode(Board b, depth) {
        int currentScore = evalNode(b, depth, Integer.MIN_VALUE, -this.maxval);
        this.maxVal = max(currentScore , this.maxVal);
        return currentScore;
    }

    private int evalNode(Board b, int depth, int alpha, int beta) {
        //...
    }

}

特定节点评估程序的实例应该适当地注入您的Checkers类。