java - 具有不同参数列表的继承

标签 java inheritance methods parameters subclass

我有一个跳棋游戏的基类,我想对其进行子类化以实现不同的树搜索算法、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 调用吗?在每个子类中重写这个似乎是一种浪费。是我缺乏想象力还是这根本不可能?

最佳答案

一种方法是引入一个接口(interface):

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) {
        //...
    }

}

并且特定节点评估器的实例应该适本地注入(inject)到您的 Checkers 类中。

关于java - 具有不同参数列表的继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20582788/

相关文章:

java - 在Java中导入ascii世界地图

php - 最终的静态类方法是否可能?

c# - C# 中的重写和继承

c++ - 指向基类的成员指针

java - 将字符串的值保存到另一个类并检索它

java - 为什么编译包含静态嵌套类的类会创建一个名为 "EnclosingClass$1"的新 .class 文件?

用于包装方法的 Java 注释

ruby - 带有可选参数的方法

java - 在类中找不到主要方法/表达式的非法开头

java - 随着模型内部状态的变化更新 java GUI