2010-06-02 5 views
7

Ich möchte eine vollständig generische treeview wie Struktur erstellen. etwas, was wie folgt aus:So erstellen Sie eine vollständige generische TreeView wie Datenstruktur

public class TreeView<T, K, L> 
{ 
    public T source; 
    public K parent; 
    public List<L> children; 
} 

, wie Sie in dieser Klasse Quelle, Eltern und auch die Kinder sehen können, alle haben eine andere generische Datentyp. Außerdem möchte ich, dass meine Baumansicht eine unbegrenzte Anzahl von Ebenen hat (nicht nur 3). Auf diese Weise, wenn ich mit meinen Knoten im Code arbeiten möchte, werden alle stark typisiert. nicht nur Objekte, die ich in ihren ursprünglichen Typ konvertieren muss.

ist es möglich, diese Art von Struktur in C# zu erstellen, eine Baumansicht, in der alle Knoten stark typisiert sind?

dank

+0

würden Sie bitte beschreiben, wie ich es erstellen kann –

+0

Sie möchten sogar verschiedene Arten für verschiedene Kinder haben? –

+0

Ja, ich brauche auch verschiedene Arten von verschiedenen Kindern. –

Antwort

2

Dies ist das große Problem mit Baumdatenstrukturen. Es ist einfach, homogene Bäume zu definieren, aber in der realen Welt bestehen Bäume oft aus heterogenen Objekttypen. Ein gutes Beispiel hierfür ist ein Dateisystem, in dem die Struktur Laufwerke, Ordner und Dateien enthält.

Sie können einen typsicheren Baum nur erstellen, wenn Sie die Form des Baums zur Kompilierzeit genau kennen. Damit entfällt natürlich jeder reale Anwendungsfall für Bäume.

2

Nun, abgesehen von einem Baum zu sein, werden Sie einige zugrunde liegende Daten. Zum Beispiel eine Verzeichnisstruktur. Die Attribute des Verzeichnisses sind der Name und eine Liste der untergeordneten Verzeichnisse. Wir beginnen mit der Definition eines generischen TreeItem.

public class TreeItem<T> { 
    public TreeItem() { 
    Children = new List<TreeItem<T>>(); 
    } 

    public void AddChild(T data) { 
    Children.Add(new TreeItem<T>{Data = data, Parent = this}); 
    } 

    public List<TreeItem<T>> Children{get;set;} 
    public TreeItem<T> Parent {get;set;} 
    public T Data {get;set;} 
} 

So ein einfacher Verzeichnisbaum ist nur ein TreeItem<string>:

var directories = new TreeItem<string> { Data="root" }; 
directories.AddChild("child1"); 
directories.AddChild("child2"); 
directories.AddChild("child3"); 

Dieser einen Baum wie dies schaffen würde:

root 
|- child1 
|- child2 
|- child3 

Der einzige Weg, eine völlig generische Baumansicht zu machen ist die gleichen Typen für den aktuellen Knoten, den Knoten über und alle untergeordneten Knoten haben, andernfalls müssen Sie die Struktur zur Kompilierzeit korrigieren und nur eine Mengenhierarchie unterstützen.

+0

Ja Ich weiß, wie man diese Art von Baumansicht erstellt, wenn alle Knoten den gleichen Datentyp haben. aber meine Frage ist, wie man es mit verschiedenen Datentypen macht und auch wie man es stark typisiert –

1

Nach dem Lesen Igors Antwort und Ihren Kommentar und kann nur sagen, das ist so nicht möglich. Sie können nur einen Basistyp verwenden, der allen Klassen gemeinsam ist, z. B. eine Basisklasse oder ein Interface.

Aber wenn Sie irgendwo in Ihrem Code benötigen die spezifische Art Sie es werfen müssen, das, wenn Rückkehr zu einer Art führen kann oder if-else-if-Struktur wie:

SpecificType specType = commonType as SpecificType; 
if(specType != null) 
{ 
    //Do something... 
    return; 
} 

AnotherSpecifcType specType2 = commonType as AnotherSpecifcType; 
if(specType2 != null) 
{ 
    //Do something... 
    return; 
} 

Aber die ist alles, was Sie tun können.