【问题标题】:Java interface nested in class嵌套在类中的 Java 接口
【发布时间】:2014-03-07 02:05:36
【问题描述】:

所以我对面向对象编程还是很陌生,我正在尝试更多地了解 Java 中的抽象类和接口。在网上闲逛时,我发现了一些遍历树的代码:

import java.util.*;

public class TreeTraverser 
{
    // Please do not change this interface
    public static interface Node 
    {
        int getValue();
        List<Node> getChildren();
    }

    public static List<Node> traverseTreeInWidth(Node root) 
    {
        /*
          Please implement this method to
          traverse the tree in width and return a list of all passed nodes.

          The list should start with the root node, next
          it should contain all second-level nodes, then third-level nodes etc.

          The method shall work optimally with large trees.
         */

        List<Node> passedNodes = new ArrayList<Node>();
        passedNodes.add(root);

        for (int i=0; i<passedNodes.size(); i++)
        {  
            for (Node child: passedNodes.get(i).getChildren())
                passedNodes.add(child);
        }

        return passedNodes;
    }
}

我的第一个问题与界面有关。我认为接口通常有自己的文件,将它包含在这样的类中的目的/好处是什么?

我的第二个问题是我如何能够访问此代码并使用我自己的树对其进行测试?我知道,如果我有另一个课程,我需要类似的东西:

public class Test implements TreeTraverser.Node {...}

但是,如果我尝试创建自己的 Node 类,然后覆盖接口中的方法,我会收到一个错误,即我的 public List getChildren() 的返回类型不兼容,所以我不确定如何测试我的自己的树。

提前感谢您尝试帮助我。

【问题讨论】:

  • 在类中包含interface 的好处是,您可以将其称为TreeTraverser.Node,以区别于您在其他地方可能拥有的其他Node 接口,并强调Node 的定义与TreeTraverser 应该如何工作有关,以提高可读性。并且:您应该能够按照您所说的方式编写Test 课程;如果它给你一个错误,你做错了什么。请发布您尝试过的Test 课程。
  • 你实现的时候,有没有把返回类型设为List&lt;TreeTraverser.Node&gt;?那应该行得通。 List&lt;Node&gt; 不会,因为没有外部类名,Node 不可见。
  • 据我所知,这是一个 betterprogrammer.com 难题的解决方案

标签: java class interface tree


【解决方案1】:

实现TreeTraverser.Node 的类应如下所示,并根据需要添加其他方法和构造函数以及其他成员:

public class Test implements TreeTraverser.Node {

    public int getValue() { ... }

    public List<TreeTraverser.Node> getChildren() { ... }
    // note that the name Node has to be qualified

}

【讨论】:

  • 据我所知,您能否详细说明您的意思是节点名称必须是合格的?我拥有它的方式是 Test 中的一个嵌套类,但那是我遇到错误的时候。
  • 将返回类型更改为 List 确实解决了错误。所以我的下一个问题是,当我有一个 Node 类时,如何将其用作 TreeTraverser.Node 或如何操作 TreeTraverser.Node?​​span>
  • @user2821731 我所说的“合格”是什么意思(我希望这是正确的术语):如果一个名称是在一个类中定义的,你不能在没有限定的情况下在该类之外使用该名称将ClassName. 放在名称前面,或者将&lt;object&gt;.&lt;expression&gt;. 表示拥有它的类的对象。这只是编译器关于哪些名称对谁以及在哪里可见的规则。 import static 可用于使某些名称可见,而无需限定符。但是我用的不多,所以我不知道它的规则。
猜你喜欢
  • 2013-10-26
  • 1970-01-01
  • 1970-01-01
  • 2011-08-01
  • 2012-02-24
  • 1970-01-01
  • 2014-04-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多