2014-03-07 81 views
0

所以我對面向對象編程還很陌生,我試圖在Java中學習更多關於抽象類和接口的知識。雖然在網上搜索我發現了一些遍歷樹的代碼:嵌套在類中的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 {...} 

但是,如果我嘗試創建我自己的節點類,然後覆蓋在接口中的方法,我得到一個錯誤,我返回類型公開名單getChildren()不兼容,所以我不知道如何去測試我自己的樹。

謝謝您提前幫助我。

+3

包括一個類內部的'interface'的好處,就是讓你可以將其稱爲'TreeTraverser.Node',以將其與其他'Node'接口區分開來,並強調'Node'的定義與'TreeTraverser'應該如何工作有關,可讀性。 AND:你應該可以按照你說的方式寫一個Test類;如果它給你一個錯誤,你做錯了什麼。請發佈您嘗試過的'Test'類。 – ajb

+0

當你實現它時,你是否使返回類型爲'List '?這應該工作。 'List '不會,因爲'Node'在沒有外部類名的情況下是不可見的。 – ajb

+0

這是一個解決betterprogrammer.com難題的方法,據我所知 – Joeblade

回答

0

實現TreeTraverser.Node應該是這個樣子,A級,與其他方法和構造函數和其他成員根據需要增加:

public class Test implements TreeTraverser.Node { 

    public int getValue() { ... } 

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

} 
+0

這個問題就我所知,你能詳細說明一下Node的名字是什麼意思嗎?我的方式是在Test中嵌套的類,但那是當我有錯誤。 – user2821731

+0

將返回類型更改爲List 確實解決了錯誤。所以我的下一個問題是什麼時候我有一個節點的類如何使用它作爲TreeTraverser.Node或我將如何操作TreeTraverser.Node? – user2821731

+0

@ user2821731我的意思是「合格」(我希望這是正確的術語):如果一個名稱是在一個類內部定義的,那麼不能在該類之外使用該名稱,而不必在前面放置'ClassName.'或者將#。或。'表示擁有該類的對象。這只是編譯器關於什麼名字對誰和哪裏可見的規則。 'import static'可用於使某些名稱可見而不需要限定符。但是我沒有太多使用它,所以我不瞭解它的規則。 – ajb