1

我会直接进入它。下面是我在 AI 应用程序中实现的 GeneralSearch 类的代码片段,用于解决字谜。我想知道如何在抽象类中实例化子类。我觉得我已经在我的 BreadthFirstSearch 类以及调用它的超级构造函数的构造函数中实现了所有相关的抽象方法。(嵌套子类)

我知道你不能实例化一个抽象类,但是从以前的线程和信息中你可以用一个抽象超类实例化一个子类。

我尝试以下调用无济于事:

GeneralSearch bfs = new BreadthFirstSearch(now.getState(), info); //正确的参数

或者。

GeneralSearch bfs = GeneralSearch.BreadthFirstSearch(now.getState(), info);

收到的错误:1)BreadthFirstSearch 无法解析为类型 2)方法 BreadthFirstSearch(WordState, WordNodeInfo) 未定义为 GeneralSearch 类型

我似乎无法获得子类的有效实例化,因此我可以执行此类搜索。如果有人能对我的困惑和理解有所了解,那就太好了。(代码如下)

  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);
      }
  }

}
4

1 回答 1

1

将 BreadthFirstSearch 类放在 GeneralSearch 类之外的单独文件中。

如果您想将其保留在那里,请尝试实例化GeneralSearch.BreadthFirstSearch而不是 just BreadthFirstSearch,但我什至不确定是否可以在它自己的父级中拥有一个子类。

在您的第二次尝试中,您缺少一个新语句:

GeneralSearch bfs = new GeneralSearch.BreadthFirstSearch(now.getState(), info);
于 2013-04-19T08:02:03.350 回答