我正在尝试使用不同的启发式方法为知情搜索创建一个抽象算法类。我的想法是让不同的子类覆盖默认的heuristic()方法,但是当我调用子类时动态绑定似乎不起作用。
在 astar.java :
public interface Astar {
abstract String heuristic();
}
在 search.java
中public class Search implements Astar {
public String heuristic() { return "default heuristic"; }
}
在 EuclidianSearch.java :
public class EuclidianSearch extends Search {
@Override
public String heuristic() { return "Euclidian"; }
}
在 ChebyshevSearch.java :
public class ChebyshevSearch extends Search {
@Override
public String heuristic() { return "Chebyshev"; }
}
在 main.java :
EuclidianSearch e_search = null; ChebyshevDistance ch_search = null;
Search[] SearchObjects = {e_search, ch_search};
for(Search so : SearchObjects) {
System.out.println(so.heuristic());
}
运行时,会显示:
default heuristic
default heuristic
我用Search
来定义数组,所以我可以灵活:最终,我希望有五种或更多种不同的启发式方法。为什么子类的heuristic()
方法不会覆盖超类的方法?
答案 0 :(得分:0)
调用so.heuristic()会得到NullPointerException,因为你不是实例类,请使用这些代码:
EuclidianSearch e_search = new EuclidianSearch();
ChebyshevDistance ch_search = new ChebyshevDistance();
但是它不足以解决你的问题,你应该通过diffrent类实现AStart接口。不要忘记实现接口的类应该实现所有接口方法。否则,你应该定义一个抽象类来定义一些方法,并在扩展你之前的类时覆盖其他类中的retain方法。
public class Search implements Astar {
@Override
public String heuristic() { return "default heuristic"; }
}