2016-05-08 5 views
0

Ich möchte eine benutzerdefinierte Baumdatenstruktur nur mit Knoten erstellen, wo ich über sie iterieren könnte. Dann konnte ich später diese Klasse erweitern und haben sehr grundlegende BaumJava-Klasse, die ihren eigenen Typ iteriert, wenn sie erweitert wird

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 
    } 
} 

ich diese bekommen haben zu arbeiten, aber das Problem kommt, wenn ich versuche, die Node-Klasse zu erweitern. Bei einer erweiterten Klasse gibt die geerbte Iterator-Methode immer noch den Knoten-Iterator zurück, was bedeutet, dass ich jedes Mal neu bestimmen muss. Hier ist ein grundlegendes Beispiel für das Problem, auf das ich gestoßen bin. Lassen Sie uns einen Baum machen, die ganzen Zahlen gilt:

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); 
    } 

} 

Gibt es eine einfache Möglichkeit, dies zu beheben, ohne dass der Iterator() -Methode von der Node-Klasse in die IntegerNode Klasse kopieren?

Antwort

1

denke ich folgendes funktioniert (nicht getestet, also nicht 100% sicher):

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); 
    } 
} 

Dies ist im Grunde eine Erweiterung der Quasi-Standard inheritable builder pattern.

+0

Vielen Dank! Ich dachte an generische Typen, aber ich habe vergessen, dass Sie den Typ beim Erweitern festlegen können. ex: IntegerNode >>> – XeroOl