2016-05-08 3 views
0

Я хотел бы создать собственную структуру данных дерева только с узлами, где я мог бы перебирать их. Тогда я мог бы позже продлить этот класс и имею очень базового деревоJava Class, который повторяет свой собственный тип при расширении

class Node{ 

    Node parent; 
    ArrayList<Node> children; 

    public static void main(String[]args){ 
     Node root = new Node(); 
     for(Node child : root){ 
      //do something 
     } 
    } 

    public Iterator<Node> iterator(){ 
     // basic tree traversal iterator 
    } 
} 

Я получил эту работу, но проблема возникает, когда я пытаюсь расширить класс Node. С расширенным классом унаследованный метод итератора по-прежнему возвращает итератор узла, что означает, что я должен запускать каждый раз. Вот основной пример проблемы, с которой я столкнулся. Давайте создадим дерево, которое держит целые числа:

class IntegerNode extends Node{ 

    int value; 

    public static void main(String[]args){ 

     IntegerNode root = new IntegerNode(); 
     int total = 0; 

     for(IntegerNode child : root){ /* Compiler error, says that the 
      iterator returns Iterator<Node> and not Iterator<IntegerNode>*/ 
      total+=child.value; 
     } 

     System.out.println(total); 
    } 

} 

Есть простой способ исправить это без необходимости копировать метод итератора() из класса Node в класс IntegerNode?

ответ

1

Я думаю, что следующий будет работать (не тестировался, так что не уверен на 100%):

class Node<T extends Node<T>> { 
    public Iterator<T> iterator(){ 
     // basic tree traversal iterator 
    } 
} 

class IntegerNode extends Node<IntegerNode> { 
    public static void main(String[]args) { 
     IntegerNode root = new IntegerNode(); 
     int total = 0; 
     for(IntegerNode child : root){ 
      total += child.value; 
     } 

     System.out.println(total); 
    } 
} 

Это в основном продолжением квази-стандарта inheritable builder pattern.

+0

Спасибо! Я думал об использовании общих типов, но я забыл, что вы можете установить тип при расширении. ex: IntegerNode >>> – XeroOl

Смежные вопросы