我会直接进入它。下面是我在GeneralSearch类中的代码片段,我正在AI应用程序中实现解决单词拼图。我想知道如何在抽象类中实例化子类。我觉得我已经在我的BreadthFirstSearch类中实现了所有相关的抽象方法,以及它的构造函数调用它的超级构造函数。 (嵌套子类)
我知道你无法实例化一个抽象类,但是从以前的线程和信息中你可以用抽象的超类来实例化一个子类。
我尝试以下调用无效:
GeneralSearch bfs = new BreadthFirstSearch(now.getState(),info); //更正参数
OR。
GeneralSearch bfs = GeneralSearch.BreadthFirstSearch(now.getState(),info);
收到的错误: 1)无法将BreadthFirstSearch解析为类型 2)对于类型GeneralSearch
,未定义方法BreadthFirstSearch(WordState,WordNodeInfo)我似乎无法获得子类的工作实例化,因此我可以执行此类搜索。如果有人能够对我的困惑和理解有所了解,那就太棒了。 (以下代码)
public abstract class GeneralSearch {
NodeInfo nodeInfo;
ArrayList unvisited, visited;
public GeneralSearch (State startState, NodeInfo nodeInfo) {
this.nodeInfo = nodeInfo;
unvisited = new ArrayList();
unvisited.add(new Node(startState, new Actions()));
visited = new ArrayList();
}
public Node search() {
Actions moves;
Action move;
//Iterating through arrayList for unvisited and possible arcs
Node visit, successor;
if(unvisited.isEmpty()) return null;
while( !unvisited.isEmpty() ) {
visit = select();
if(nodeInfo.isGoal(visit)) return visit;
moves = visit.getState().getActions();
Iterator<Action> it = moves.iterator();
while(it.hasNext()) {
successor = (Node) visit.clone();
move = it.next();
successor.getState().update(move);
insert(successor);
}
visited.add(visit);
}
return null;
}
public abstract Node select ();
public abstract void insert (Node node);
public class BreadthFirstSearch extends GeneralSearch {
public BreadthFirstSearch(State startState, NodeInfo nodeInfo) {
super(startState, nodeInfo);
}
public Node select() {
return (Node) visited.get(0);
}
public void insert(Node node) {
unvisited.add(node);
}
}
}
答案 0 :(得分:1)
将BreadthFirstSearch类放在GeneralSearch类之外的单独文件中。
如果你想保留它,请尝试实例化GeneralSearch.BreadthFirstSearch
而不仅仅是BreadthFirstSearch
,但我甚至不确定它是否有可能在它自己的父类中有一个子类。
在你的第二次尝试中,你错过了一个新陈述:
GeneralSearch bfs = new GeneralSearch.BreadthFirstSearch(now.getState(), info);