2013-06-26 45 views
1

在以下示例中,TreeNode是超類,BinaryNode是子類。Java繼承最大限度地重用

public class TreeNode { 
    private int data; 
    private TreeNode parent; 
    private List<TreeNode> children; 

    TreeNode() { 
     this.data = 0; 
     this.parent = null; 
     this.children = new ArrayList<TreeNode>(); 
    } 
} 

在子類中,每個節點只有兩個孩子。 我寫如下。

我應該如何編寫成員字段和構造函數以最好地使用超類,但保持結構正確?

public class BinaryNode extends TreeNode { 
// int data; 
// BinaryNode parent; 
    List<BinaryNode> children; 

    BinaryNode() { 
     super(); 
     children = new ArrayList<BinaryNode>(2); 
    } 
} 

在構造函數中調用BinaryNode(),super()對兒童有什麼影響?更重要的是,如果子類在某些字段上有特定的規則,如本示例中只有兩個孩子,那麼如何在超類和子類中編寫構造函數以最大限度地重用?

如果我在超類中有以下方法isLeaf(),不要寫在子類中。 當我嘗試將它與子類實例一起使用時,它會正常工作嗎?

public boolean isLeaf() { 
    if(this.children == null) 
     return true; 
    else 
     return false; 
} 
+0

只看這一點,是這一點,使自己的數據結構?如果是這樣,那麼'children'應該是你擁有的類的實例或列表,即'private BinaryNode leftNode;'和'Private BinaryNode rightNode;' – chancea

+0

將會有2個「children」實例,一個在超類中,另一個在子類中...在子類中,你看不到父類的「children」字段,因爲它是私有的... – Renato

+0

回答isLeaf()問題:不,它不會工作...只是嘗試它...在超類與子類中的不一樣。在你的小班中,你看不到超級的孩子......你需要保護孩子,然後擺脫子課程中的孩子....然後你的小班將有「正確」的孩子:) – Renato

回答

0

您標誌着超保護的屬性和子類都應該有機會獲得他們:

public class TreeNode { 
     protected int data; 
     protected TreeNode parent; 
     protected List<TreeNode> children; 

    ... 

    public boolean isLeaf() { 
      if(this.children == null) 
      return true; 
      else 
      return false; 
    } 
} 
+0

我最擔心的是,我必須完全重寫構造函數才能獲得兩個孩子的特徵,還是隻需要重寫孩子的一部分?你可以給我一個例子嗎? – Zoe

+0

'公共類BinaryNode擴展TreeNode {...} - 你的孩子仍然會這樣,但是當你將父類的屬性標記爲受保護的時候,子類將會訪問它們。 – mel3kings