Foros - Stratos

Programadores => General Programadores => Mensaje iniciado por: Hechelion en 11 de Junio de 2012, 01:05:15 PM

Título: interacción de objetos hijos sobre objeto padre en VB NET
Publicado por: Hechelion en 11 de Junio de 2012, 01:05:15 PM
Saludos.

Tengo una duda de diseño respecto a POO, la cual, más que practica es teórica.

Si tengo un objeto padre, el cual en su interior tiene una única lista de objetos hijos que no necesariamente son iguales (polimorfismo) y quiero que cada objeto hijo pueda tomar acciones que afecten la lista de objetos del padre.
¿Se puede hacer (pensando en POO y no con "malas practicas")? ¿Cuál sería la forma correcta de hacerlo (pensando en POO)?


Por si no a quedado claro, voy a colocar el ejemplo.
Tengo una clase jugador (la clase padre), la cual posee una lista de objetos item (las clases hijos), donde ítem ,puede ser un ítem armadura, un ítem consumible, etc.

Cada clase ítem tiene una función "usar" que es la que determina que acciones se deben ejecutar para ese objeto, por ejemplo, si invoco la función "usar" de un objeto consumible este debe darse de baja de la lista de objetos del padre, en otras palabras, es el hijo el que debe invocar la baja.
¿Cual es la forma correcta de hacer esto?, ¿usar eventos o hay alguna alternativa (usando VB NET)?
Título: Re: interacción de objetos hijos sobre objeto padre en VB NET
Publicado por: Vicente en 11 de Junio de 2012, 07:11:10 PM
Los hijos pueden tener una referencia al padre para acceder al metodo EliminarItem(item), o si no quieres pasar la referencia, puedes pasar una lambda al metodo.
Título: Re: interacción de objetos hijos sobre objeto padre en VB NET
Publicado por: Hechelion en 11 de Junio de 2012, 09:06:49 PM
Gracias por la respuesta Vicente.

Entonces ¿no es sacrilegio pasar al padre como referencia?

Sobre el lambda, no lo conozco mucho, pero por lo que tengo entendido tendría el mismo problema, necesito una referencia al padre para poder hacer referencia al método "dar de baja" o estoy mal y hay alguna manera de hacer referencia al método del padre sin hacer la referencia?.
Título: Re: interacción de objetos hijos sobre objeto padre en VB NET
Publicado por: Vicente en 11 de Junio de 2012, 10:12:10 PM
No es sacrilego, es algo bastante normal cuando tienes una estructura parecida a un arbol.

Sobre la lambda, no tienes porque pasar la referencia al padre, lo que pasas es un delegado que invoca la funcion del padre, ya se encarga .NET de que todo tenga el contexto correcto. En VB no se muy bien como va la sintaxis, en C# seria algo como.

La clase Item tendria una propiedad con un delegado tal que asi:

public Action RemoveAction { get; set; }


Y su metodo Usar

public void Usar()
{
   // hacer cosas varias
   RemoveAction(); // Eliminarnos de la lista
}


Y el padre, al crear el hijo haria algo como

public void CrearHijo()
{
    Item hijo = new Item();
    hijo.RemoveAction = () => this.Remove(hijo); // Asumiendo que los hijos se guardan en una lista
}


La gracia de las lambdas es que pueden acceder a variables del contexto donde se declaran lo cual es muy util como por ejemplo en este caso :)

Pero vamos, la idea es mas o menos la misma que la de pasar el padre por referencia.

Un saludo!

Vicente
Título: Re: interacción de objetos hijos sobre objeto padre en VB NET
Publicado por: Hechelion en 11 de Junio de 2012, 10:49:40 PM
Gracias nuevamente Vicente, ahí me ha quedado más claro, no sé por que cuando me hablaste de lambda, pensaba en implementarlo por el lado del hijo en vez de por el lado del padre  :-[
Título: Re: interacción de objetos hijos sobre objeto padre en VB NET
Publicado por: bnl en 12 de Junio de 2012, 10:40:20 AM
Coincido con Vicente en que no hay ningun probema en que el hijo tenga una referencia al padre. De esta forma el hijo podria eliminarse de la coleccion de objetos del padre.

Otra opcion podria ser implementar el patron observador. El hijo notifica al padre que se ha "consumido" o eliminado y este le quita de la coleccion de objetos.

http://es.wikipedia.org/wiki/Observer_(patr%C3%B3n_de_dise%C3%B1o)

La solución mas simple suele ser la mejor. Yo simplemente le pasaria al hijo la referencia al padre.
Título: Re: interacción de objetos hijos sobre objeto padre en VB NET
Publicado por: Hechelion en 12 de Junio de 2012, 07:13:21 PM
Gracias por la respuesta bnl, aunque te ha faltado un paréntesis en el link (ahora que veo con calma, lo tienes, pero no está dentro del hipervinculo).

Tal como sugieren he optado por pasar la referencia del padre, me parece la mejor opción ya que el caso que comento es solo uno de todos los posibles, otros casos deben modificar las propiedades del padre, como por ejemplo, la vida del jugador, etc.