2010-06-02 5 views
7

Я хочу создать полностью общую структуру дерева. некоторые вещи, как это:Как создать полную общую структуру TreeView, такую ​​как структура данных

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

как вы можете видеть в этом источнике класса, родителей, а также детей, все они имеют различный общий тип данных. также я хочу, чтобы у моего дерева было неограниченное количество уровней (не только 3). таким образом, когда я хочу работать с моими узлами в коде, все они будут строго типизированы. а не только объекты, которые мне нужно преобразовать в их оригинальный тип.

Возможно ли создать такую ​​структуру в C#, древовидной структуре, которую все его узлы сильно типизированы?

благодаря

+0

Не могли бы вы описать, как я могу его создать –

+0

Вы даже хотите иметь различный тип для разных детей? –

+0

Да, мне тоже нужен другой тип разных детей. –

ответ

2

Это большая проблема с древовидными структурами данных. Легко определить однородные деревья, но в реальном мире деревья часто состоят из разнородных типов объектов. Хорошим примером этого является файловая система, в которой дерево содержит диски, папки и файлы.

Вы можете создать только безопасное дерево типа, если вы точно знаете форму дерева во время компиляции. Конечно, это исключает каждый случай использования в реальном мире для деревьев.

2

Ну, помимо того, что дерево, вы будете иметь некоторые базовые данные. Например дерево каталогов. Атрибутами каталога являются его имя и список дочерних каталогов. Начнем с определения общего числа 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;} 
} 

Так простое дерево каталогов, просто TreeItem<string>:

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

Это создало бы дерево, как это:

root 
|- child1 
|- child2 
|- child3 

Единственный способ сделать совершенно общий вид дерева иметь те же типы для текущего узла, узла выше и всех дочерних узлов, в противном случае вы должны исправить структуру во время компиляции и поддерживать только иерархию наборов.

+0

Да Я знаю, как создать такой вид дерева, когда все узлы имеют одинаковый тип данных. но мой вопрос о том, как сделать это с разными типами данных, а также как сделать его строго типизированным –

1

После прочтения Igors ответьте и ваш комментарий и можете просто сказать, что это невозможно. Все, что вы можете сделать, это использовать как T базовый тип, который имеет все классы, как базовый класс или интерфейс.

Но если вам нужно где-то в вашем коде конкретный тип вам нужно, чтобы бросить его, что может привести к какой-то, если возврате или если-иначе-если структура, как:

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

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

Но что это все, что вы можете сделать.

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