实例化抽象类的子类

时间:2013-04-19 07:58:00

标签: java search abstract-class instance subclass

我会直接进入它。下面是我在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);
      }
  }

}

1 个答案:

答案 0 :(得分:1)

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

如果你想保留它,请尝试实例化GeneralSearch.BreadthFirstSearch而不仅仅是BreadthFirstSearch,但我甚至不确定它是否有可能在它自己的父类中有一个子类。

在你的第二次尝试中,你错过了一个新陈述:

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