2010-06-02 9 views
7

Quiero crear una estructura de vista de árbol completamente genérica. algo como esto:Cómo crear una estructura de datos TreeView genérica completa

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

como se puede ver en esta fuente de la clase, los padres y los niños, todos tienen un tipo de datos genérico diferente. también quiero que mi vista de árbol tenga una cantidad ilimitada de niveles (no solo 3). De esta forma, cuando quiera trabajar con mis nodos en el código, todos estarán fuertemente tipados. no solo los objetos que necesito para convertirlos a su tipo original.

¿es posible crear este tipo de estructura en C#, una vista de árbol con todos sus nodos fuertemente tipados?

gracias

+0

¿podría describir cómo puedo crearlo? –

+0

¿Incluso desea tener un tipo diferente para niños diferentes? –

+0

Sí, también necesito diferentes tipos de niños diferentes. –

Respuesta

2

Este es el gran problema con las estructuras de datos de árbol. Es fácil definir árboles homogéneos, pero en el mundo real, los árboles a menudo están compuestos por tipos de objetos heterogéneos. Un buen ejemplo de esto es un sistema de archivos, donde el árbol contiene unidades, carpetas y archivos.

Solo puede crear un árbol seguro de tipo si conoce exactamente la forma del árbol en tiempo de compilación. Por supuesto, esto elimina todos los casos de uso del mundo real para los árboles.

2

Bueno, aparte de ser un árbol, va a tener algunos datos subyacentes. Por ejemplo, un árbol de directorios. Los atributos del directorio son su nombre y una lista de directorios secundarios. Comenzamos definiendo un genérico 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;} 
} 

Así que un simple árbol de directorios es sólo un TreeItem<string>:

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

Esto crearía un árbol como este:

root 
|- child1 
|- child2 
|- child3 

La única manera de hacer un punto de vista completamente genérico árbol es tener los mismos tipos para el nodo actual, el nodo anterior y todos los nodos secundarios; de lo contrario, deberá corregir la estructura en tiempo de compilación y solo admitirá una jerarquía establecida.

+0

Sí, sé cómo crear este tipo de vista de árbol, cuando todos los nodos tienen el mismo tipo de datos. pero mi pregunta es acerca de cómo hacerlo con diferentes tipos de datos y también cómo hacer que sea fuertemente tipado –

1

Después de leer la respuesta de Igors y su comentario, podemos decir que esto no es posible de esa manera. Todo lo que puede hacer es usar como T algún tipo de base que todas las clases tengan en común, como una clase base o una interfaz.

Pero si necesitas un lugar en el código del tipo específico que necesitará para su emisión que puede dar lugar a algún tipo de caso de retención o si-else-if estructura como:

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

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

Pero eso es todo lo que puedes hacer

Cuestiones relacionadas