Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





interacción de objetos hijos sobre objeto padre en VB NET

Iniciado por Hechelion, 11 de Junio de 2012, 01:05:15 PM

« anterior - próximo »

Hechelion

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)?

Vicente

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.

Hechelion

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?.

Vicente

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

Hechelion

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  :-[

bnl

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.
Mi web: http://www.brausoft.com/
No sabían que era imposible, así que lo hicieron.

Hechelion

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.






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.