2010-06-02 11 views
7

Chcę utworzyć całkowicie ogólną strukturę podobną do drzewa. coś takiego:Jak utworzyć kompletną ogólną strukturę danych typu TreeView

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

jak widać w źródłach tej klasy, rodzic, a także dzieci, wszystkie mają inny ogólny typ danych. także chcę, aby mój widok drzewa miał nieograniczoną liczbę poziomów (nie tylko 3). w ten sposób, gdy chcę pracować z moimi węzłami w kodzie, wszystkie będą mocno wpisane. nie tylko obiekty, które muszę przekonwertować na ich oryginalny typ.

Czy możliwe jest stworzenie tego typu struktury w C#, widoku drzewa, w którym wszystkie jego węzły są silnie wpisane?

dziękuję

+0

Czy mógłbyś opisać, jak mogę go stworzyć? –

+0

Czy chcesz mieć inny typ dla różnych dzieci? –

+0

Tak, potrzebuję innego rodzaju różnych dzieci. –

Odpowiedz

2

To jest duży problem z strukturami danych drzewa. Łatwo jest zdefiniować jednorodne drzewa, ale w świecie rzeczywistym drzewa często składają się z heterogenicznych typów obiektów. Dobrym tego przykładem jest system plików, w którym drzewo zawiera dyski, foldery i pliki.

Można utworzyć tylko bezpieczne drzewo typów, jeśli dokładnie znasz kształt drzewa podczas kompilacji. Oczywiście eliminuje to wszystkie przypadki użycia drzew w świecie rzeczywistym.

2

Cóż, oprócz bycia drzewem, będziesz mieć kilka podstawowych danych. Na przykład drzewo katalogów. Atrybuty katalogu to jego nazwa i lista katalogów potomnych. Zaczynamy od zdefiniowania generycznego 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;} 
} 

Tak proste drzewo katalogów jest tylko TreeItem<string>:

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

spowodowałoby to drzewo tak:

root 
|- child1 
|- child2 
|- child3 

Jedynym sposobem, aby całkowicie rodzajowy widok drzewo mieć te same typy dla bieżącego węzła, węzła powyżej i wszystkich węzłów podrzędnych, w przeciwnym razie trzeba naprawić strukturę w czasie kompilacji i wspierać tylko ustaloną hierarchię.

+0

Tak, wiem, jak utworzyć ten rodzaj widoku drzewa, gdy wszystkie węzły mają ten sam typ danych. ale moje pytanie dotyczy tego, jak zrobić to z różnymi typami danych, a także jak je mocno napisać –

1

Po przeczytaniu odpowiedzi Igors i komentarza można powiedzieć, że nie jest to możliwe w ten sposób. Wszystko, co możesz zrobić, to używać jako podstawowego typu wszystkich klas, takich jak klasa bazowa lub interfejs.

Ale jeśli trzeba gdzieś w kodzie specyficzny typ trzeba go co może prowadzić do pewnego rodzaju cast jeśli zwrotny lub if-else-if struktura jak:

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

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

ale to wszystko, co możesz zrobić.

Powiązane problemy