Primer ejercicio con delegados

17/01/2006 - 02:22 por Benton | Informe spam
Hola,

Necesito resolver el siguiente caso y creo que la solución son los
delegados, pero nunca los he manejado. Necesito que un método de la clase
Hija (Guardar) haga que se ejecute un método de la clase Padre
(GuardarTodo). En escencia estas son las clases:

class Padre
{
Hija h = new Hija();

public void Guardar()
{
h.Guardar();
}

private void GuardarTodo()
{
// Este método debe ser llamado
// desde el método h.Guardar()
}
}

class Hija
{
public Guardar()
{
// Llama al método GuardarTodo() de la clase Padre.
}
}

Gracias de antemano,

-Benton

Preguntas similare

Leer las respuestas

#1 Benton
17/01/2006 - 03:11 | Informe spam
Mil gracias, pero más que un copy/paste del MSDN me serviría si alguien me
ayuda a ponerle el cascabel al gato, es decir, a poner las líneas que le
faltan al ejemplo de clases que puse. Espero que no sea mucho pedir. Tengo
claro el problema, si alguien le agrega la solución, me quedaría claro el
funcionamiento de los delegados, viéndolos trabajar con *mi* ejemplo y no
con uno abstracto de libro de texto.

Saludos,

-Benton

"Oscar Roberto Onorato" <oscaronorato[ARROBA]hotmail.com> copió del MSDN en
el mensaje news:%
Un evento es un mensaje que envía un objeto cuando ocurre una acción. La
acción puede estar causada por la interacción del usuario, como un clic, o
por otra lógica del programa. El objeto que provoca (desencadena) el evento
se denomina remitente del evento. El objeto que captura el evento y responde
a él se denomina receptor del evento.
Respuesta Responder a este mensaje
#2 José Escrich
17/01/2006 - 03:44 | Informe spam
Benton te paso dos ejemplos, uno es como lo encararía yo con una interfaz
y la segunda con el delegado..., de todas formas imagino que pusiste algo
a modo de ejemplo, tene cuidado con la recurrencia, el flujo adecuado deberia
ser de padre a hijo y no que suba posteriormente... podes perder el control
facilmente.

EJEMPLO 1: utilizando una interface
public interface IGuardable
{
void GuardarTodo();
}

public class Padre : IGuardable
{
Hija h;
public Padre() { h = new Hija(this); }

public void Guardar()
{
h.Guardar();
}

public void GuardarTodo()
{
// Este método debe ser llamado
// desde el método h.Guardar()
}
}
class Hija
{
private Object parent;

public Hija(object parent)
{
}

public void Guardar()
{
// Llama al método GuardarTodo() de la clase Padre.
if (parent is IGuardable)
((IGuardable)parent).GuardarTodo();
}
}

EJEMPLO 2: con delegados
public delegate void GuardarTodoDelegate();

public class Padre
{
Hija h = new Hija();

public void Guardar()
{
h.Guardar(new GuardarTodoDelegate(GuardarTodo));
}

private void GuardarTodo()
{
// Este método debe ser llamado
// desde el método h.Guardar()
Console.WriteLine("Listo, guardo todo.");
}
}
class Hija
{
public void Guardar(GuardarTodoDelegate guardarTodo)
{
guardarTodo();
}
}

saludos, espero te sirva ;)


José Escrich
jescrich (a) gmail.com
http://latincoder.com

B> Hola,
B>
B> Necesito resolver el siguiente caso y creo que la solución son los
B> delegados, pero nunca los he manejado. Necesito que un método de la
B> clase Hija (Guardar) haga que se ejecute un método de la clase Padre
B> (GuardarTodo). En escencia estas son las clases:
B>
B> class Padre
B> {
B> Hija h = new Hija();
B> public void Guardar()
B> {
B> h.Guardar();
B> }
B> private void GuardarTodo()
B> {
B> // Este método debe ser llamado
B> // desde el método h.Guardar()
B> }
B> }
B> class Hija
B> {
B> public Guardar()
B> {
B> // Llama al método GuardarTodo() de la clase Padre.
B> }
B> }
B> Gracias de antemano,
B>
B> -Benton
B>
Respuesta Responder a este mensaje
#3 A.Poblacion
17/01/2006 - 07:44 | Informe spam
"Benton" wrote in message
news:
Necesito resolver el siguiente caso y creo que la solución son los
delegados, pero nunca los he manejado. Necesito que un método de la clase
Hija (Guardar) haga que se ejecute un método de la clase Padre
(GuardarTodo). En escencia estas son las clases:

class Padre
{
Hija h = new Hija();

protected delegate void MiDelegado();

public void Guardar()
{
MiDelegado retrollamada = new MiDelegado(GuardarTodo);
h.Guardar(retrollamada);
}

private void GuardarTodo()
{
// Este método debe ser llamado
// desde el método h.Guardar()
}
}

class Hija
{
public Guardar(MiDelegado retrollamada)
{
// Llama al método GuardarTodo() de la clase Padre.
retrollamada();
}
}

Gracias de antemano,




Arriba te he insertado dentro de tu código lo que hay que hacer para usar
delegados. Pero, en mi opinión, no se trata de la solución más elegante. En
lugar de usar delegados, yo haría "protected" la función GuardarTodo y la
llamaría directamente desde la clase hija. Además, también haría virtual la
función Guardar y le haría un override en la clase hija (y si fuera
necesario desde ella llamaría al base.Guardar), en lugar de llamar al
Guardar de la hija desde el Guardar de la madre.
Respuesta Responder a este mensaje
#4 Benton
17/01/2006 - 17:04 | Informe spam
Gracias, A. Población. Estoy de acuerdo en que la solución mediante
herencia/polimorfismo es mejor, pero en mi ejemplo la clase Hija no hereda
de la clase Padre, son totalmente independientes. Sus nombres causan
confusión, mea culpa. :-)

Saludos,

-Benton


"A.Poblacion" escribió en
el mensaje news:
"Benton" wrote in message
news:
Necesito resolver el siguiente caso y creo que la solución son los
delegados, pero nunca los he manejado. Necesito que un método de la clase
Hija (Guardar) haga que se ejecute un método de la clase Padre
(GuardarTodo). En escencia estas son las clases:

class Padre
{
Hija h = new Hija();

protected delegate void MiDelegado();

public void Guardar()
{
MiDelegado retrollamada = new MiDelegado(GuardarTodo);
h.Guardar(retrollamada);
}

private void GuardarTodo()
{
// Este método debe ser llamado
// desde el método h.Guardar()
}
}

class Hija
{
public Guardar(MiDelegado retrollamada)
{
// Llama al método GuardarTodo() de la clase Padre.
retrollamada();
}
}

Gracias de antemano,




Arriba te he insertado dentro de tu código lo que hay que hacer para usar
delegados. Pero, en mi opinión, no se trata de la solución más elegante.
En lugar de usar delegados, yo haría "protected" la función GuardarTodo y
la llamaría directamente desde la clase hija. Además, también haría
virtual la función Guardar y le haría un override en la clase hija (y si
fuera necesario desde ella llamaría al base.Guardar), en lugar de llamar
al Guardar de la hija desde el Guardar de la madre.


email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida