¿Herencia, interfaz, o reflection?

17/03/2007 - 06:15 por Marianoh | Informe spam
Hola a todos:

Tengo una clase A cuyo objetivo es contener una colección de clases
B, y otra de clases A, las cuales contienen una colección de clases B,
una de clases A...y etc, en fín: una estructura de árbol n-ario.

La clase A también contiene un método que devuelve una colección de
todas las B propias y de sus descendientes.

En principio declaré un System.Collections.Generic.List<B> dentro
de la clase A expuesta como propiedad, por lo que con
"A.misDescendientesB()", obtengo la colección.

Mi problema: El diseño falla en el momento en que a partir de un
objeto B necesito obtener el objeto A que lo contiene. Una analogía
sería un objeto XmlNode (B) con su propiedad OwnerDocument (que
retorna el XmlDocument (A) que lo contiene), eso es lo que yo
necesito.

Todavía estoy a tiempo de hacer algún cambio de mediana
envergadura, por lo que quisiera su opinión sobre la mejor manera de
implementar esta funcionalida.
No se si importa pero como la función de B es solo contener datos,
me gustaría que fuera una estructura, lo mismo, si es factible, que A.

Agradezco sus comentarios.

Preguntas similare

Leer las respuestas

#1 Marianoh
17/03/2007 - 06:24 | Informe spam
Perdón, el título del post es incorrecto.
Respuesta Responder a este mensaje
#2 jancic.replication
17/03/2007 - 06:44 | Informe spam
Hola,
Creo que hay varias formas de hacerlo... las que se me ocurren son:

1) en el constructor de B especificarle el parent

2) que A.coleccion_de_Bs sea del tipo IList<B>, y usas una
implementacion para que cuando hagas un A.coleccion_de_Bs.Add(b), a
"b" se le setee el parent

3) Usar el metodo que utilizan los DataTables con sus datarows (no me
gusta mucho), seria algo como:
A a = new A();
B b = a.NewB(); // Aca se crea un B y se le asigna:
b.Parent = this
a.coleccion_de_Bs.Add(b);

De las 3 cosas lo que haria es crear un objeto Root, que contiene una
coleccion de A y una de B. El objeto Root obviamente es el parent de
todo el arbol. A los constructores de los hijos (A y B) se le tiene
que especificar obligatoriamente el Parent...


Saludos!,
Diego
Respuesta Responder a este mensaje
#3 Marianoh
19/03/2007 - 18:26 | Informe spam
Diego, gracias por contestar:

La opción "tipo DataRow" es facil de implementar pero coincido con
vos en que no me gusta, principalmente por el tema de que mis clases
no tiene una estructura variable.

Incluir el parent en el constructor también me soluciona el tema,
pero como esta clase será reulizable, quisiera que se trabaje al
estilo xmlDocuement, que me parece más natural.

Ahora yo entiendo que para utilizar una interfaz como indicas en el
punto 2, tengo que crear una clase que implemente IList, y en vez de
declarar un List<B>, declarar una instancia de esa clase, ¿pero esto
no me obliga a implementar todos los metodos de IList<T>? yo necesito
nada mas sobreescribir el método Add para que setee el parent, ¿esto
es posible?

Gracias por sus comentarios

ha escrito:
Hola,
Creo que hay varias formas de hacerlo... las que se me ocurren son:

1) en el constructor de B especificarle el parent

2) que A.coleccion_de_Bs sea del tipo IList<B>, y usas una
implementacion para que cuando hagas un A.coleccion_de_Bs.Add(b), a
"b" se le setee el parent

3) Usar el metodo que utilizan los DataTables con sus datarows (no me
gusta mucho), seria algo como:
A a = new A();
B b = a.NewB(); // Aca se crea un B y se le asigna:
b.Parent = this
a.coleccion_de_Bs.Add(b);

De las 3 cosas lo que haria es crear un objeto Root, que contiene una
coleccion de A y una de B. El objeto Root obviamente es el parent de
todo el arbol. A los constructores de los hijos (A y B) se le tiene
que especificar obligatoriamente el Parent...


Saludos!,
Diego
Respuesta Responder a este mensaje
#4 Diego Jancic
19/03/2007 - 19:14 | Informe spam
On Mar 19, 2:26 pm, "Marianoh" wrote:
Diego, gracias por contestar:

La opción "tipo DataRow" es facil de implementar pero coincido con
vos en que no me gusta, principalmente por el tema de que mis clases
no tiene una estructura variable.

Incluir el parent en el constructor también me soluciona el tema,
pero como esta clase será reulizable, quisiera que se trabaje al
estilo xmlDocuement, que me parece más natural.

Ahora yo entiendo que para utilizar una interfaz como indicas en el
punto 2, tengo que crear una clase que implemente IList, y en vez de
declarar un List<B>, declarar una instancia de esa clase, ¿pero esto
no me obliga a implementar todos los metodos de IList<T>? yo necesito
nada mas sobreescribir el método Add para que setee el parent, ¿esto
es posible?

Gracias por sus comentarios

ha escrito:> Hola,
> Creo que hay varias formas de hacerlo... las que se me ocurren son:

> 1) en el constructor de B especificarle el parent

> 2) que A.coleccion_de_Bs sea del tipo IList<B>, y usas una
> implementacion para que cuando hagas un A.coleccion_de_Bs.Add(b), a
> "b" se le setee el parent

> 3) Usar el metodo que utilizan los DataTables con sus datarows (no me
> gusta mucho), seria algo como:
> A a = new A();
> B b = a.NewB(); // Aca se crea un B y se le asigna:
> b.Parent = this
> a.coleccion_de_Bs.Add(b);

> De las 3 cosas lo que haria es crear un objeto Root, que contiene una
> coleccion de A y una de B. El objeto Root obviamente es el parent de
> todo el arbol. A los constructores de los hijos (A y B) se le tiene
> que especificar obligatoriamente el Parent...

> Saludos!,
> Diego




Hola,
No se si soluciona el problema, pero supongo que podrias heredar de
List en vez de IList, asi te ahorrarias implementar todo el resto de
los metodos.
De todas formas es bastante facil implementar todos los metodos.
Tene cuidado con cosas como:

A padre1 = new A()
A padre 2 = new A();
padre1.Childs.Add(new A());
padre2.Childs.Add(padre1[0]);

// Aca padre1.Childs[0] == padre2.Chidls[0] !!!

Supongo que en la linea 4 deberias tirar una excepcion diciendo que un
item no puede tener 2 padres..

Saludos!,
Diego
Respuesta Responder a este mensaje
#5 Marianoh
19/03/2007 - 23:44 | Informe spam
Gracias Diego.

Ya había probado de heredar de List, pero no puedo sobreescribir el
método Add.

Bueno, a esta altura me parece que lo más lógico es implementar toda
la interfaz.

Gracias por tus consejos.

Saludos
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida