2013-06-26 3 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); 
    } 
} 

in constructor BinaryNode(), super() называется, что влияет на детей?

Более того, если подкласс имеет определенные правила в некоторых полях, например, только два ребенка в этом примере, как написать конструкторы в суперклассе и подклассе, чтобы максимизировать повторное использование?

Если у меня есть следующий метод isLeaf() в суперклассе и не записывайте его в подкласс. Когда я пытаюсь использовать его с экземпляром подкласса, будет ли он работать правильно?

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

Просто глядя на это, является точкой этого сделать свою собственную структуру данных? Если это так, то «дети» должны быть списками или экземплярами класса, который у вас есть, т.е. «private BinaryNode leftNode;» и «private BinaryNode rightNode;» – chancea

+0

. Будет два экземпляра «дети», один в суперклассе и один в подклассе ... в подклассе вы не можете видеть поле «дети» суперкласса, потому что оно личное ... – 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

'public class BinaryNode расширяет TreeNode {...}' - ваш ребенок по-прежнему будет таким, но если вы помечаете атрибуты родительского класса как защищенные, тогда дочерний класс получит доступ к ним. – mel3kings