2017-11-20 3 views
0

Ich versuche, eine einfache Struktur in einer Java-Klasse zu implementieren. Ich möchte jedoch, dass eine andere Klasse diese Baumklasse erweitert.Java-Klasse vererbt Selbstreferenz Klasse

Ich mache den Baum rekursiv wie folgt aus:

class Tree<T> { 
    public T data; 
    public List<Tree<T>> children; 

    public Tree(T data){ 
     this.data = data; 
    } 
} 

jedoch sagen, dass ich eine Klasse wie folgt machen:

class WeightedTree<T> extends Tree<T> 

es Kinder sind alle regulären Bäume, nicht Weighted Bäume. Gibt es eine Möglichkeit, dies mit OOP-Prinzipien zu erreichen?

Antwort

2

Sie können etwas tun:

class Tree<T, SELF extends Tree<T, SELF>> { 
    public T data; 
    public List<SELF> children; 
} 

class WeightedTree<T> extends Tree<T, WeightedTree<T>> {} 

Wenn Sie Tree instanziiert benötigen, können Sie einen Platzhalter verwenden:

Tree<String, ?> tree = new Tree<>(); 

Oder Sie können eine abstrakte Basisklasse mit einem selbst Typ machen und separate Unterklassen für Tree und WeightedTree.

+0

Ihr Platzhalterbeispiel funktioniert nicht: Sie können einen solchen Typ nicht instanziieren. – ruakh

+0

@ruakh Sie können aber, wenn es abgeleitet wird. – shmosel

+0

Mein Wort, du hast Recht! So bizarr. Danke für die Korrektur. :-) – ruakh

0
/* Package */ abstract class TreeBase<T, TREE_T extends TreeBase<T, TREE_T>> { 
    public T data; 
    public List<TREE_T> children; 

    public TreeBase(T data) { 
     this.data = data; 
    } 
} 

public class Tree<T> extends TreeBase<T, Tree<T>> { 
    public Tree(T data) { 
     super(data); 
    } 
} 

public class WeightedTree<T> extends TreeBase<T, WeightedTree<T>> { 
    public WeightedTree(T data) { 
     super(data); 
    } 
}