Pregunta

¿Cuáles son algunos lugares del mundo real que requieren delegados?Tengo curiosidad por saber qué situaciones o patrones están presentes en los que este método es la mejor solución.No se requiere código.

¿Fue útil?

Solución

Un delegado es un tipo con nombre que define un tipo particular de método.Así como una definición de clase establece todos los miembros para el tipo de objeto que define, el delegado establece la firma del método para el tipo de método que define.

Según esta declaración, un delegado es un puntero de función y define cómo se ve esa función.

Un gran ejemplo de una aplicación del mundo real de un delegado es el Predicado.En el ejemplo del enlace, notarás que Array.Buscar toma la matriz para buscar y luego un predicado para manejar los criterios de qué encontrar.En este caso pasa un método ProductGT10 que coincide con la firma del Predicado.

Otros consejos

Como se indica en "Aprendiendo C# 3.0:Domina los fundamentos de C# 3.0"

Escenario general: Cuando un jefe de estado muere, el presidente de los Estados Unidos generalmente no tiene tiempo para asistir al funeral personalmente.En cambio, envía un delegado.A menudo, este delegado es el vicepresidente, pero a veces el vicepresidente no está disponible y el presidente debe enviar a alguien más, como el Secretario de Estado o incluso la Primera Dama.No quiere "hardwire" su autoridad delegada a una sola persona;Podría delegar esta responsabilidad con cualquiera que pueda ejecutar el protocolo internacional correcto.

El Presidente define de antemano qué responsabilidad se delegará (asista al funeral), qué parámetros se pasarán (condolencias, palabras amables) y qué valor espera recuperar (buena voluntad).Luego asigna a una persona en particular a esa responsabilidad delegada en "tiempo de ejecución" a medida que avanza el curso de su presidencia.

En el escenario de programación: A menudo se enfrenta a situaciones en las que necesita ejecutar una acción en particular, pero no sabe de antemano qué método, o incluso qué objeto, querrá llamar para ejecutarla.

Por ejemplo: Es posible que un botón no sepa qué objeto u objetos deben ser notificados.En lugar de cablear el botón a un objeto en particular, conectará el botón a un delegado y luego resolverá ese delegado a un método particular cuando el programa se ejecute.

Un uso común de los delegados para listas genéricas es a través de delegados de acción (o su equivalente anónimo) para crear una operación foreach de una línea:

myList.Foreach( i => i.DoSomething());

También encuentro que el delegado Predicado es bastante útil para buscar o podar una Lista:

myList.FindAll( i => i.Name == "Bob");    
myList.RemoveAll( i => i.Name == "Bob");

Sé que dijiste que no se requiere código, pero me resulta más fácil expresar su utilidad mediante código.:)

Vincular eventos a controladores de eventos suele ser su primera introducción a los delegados... Es posible que ni siquiera sepa que los está utilizando porque el delegado está incluido en la clase EventHandler.

Si está interesado en ver cómo se usa el patrón Delegate en el código del mundo real, no busque más que Cocoa en Mac OS X.Cocoa es el kit de herramientas de interfaz de usuario preferido de Apple para programar en Mac OS X y está codificado en Objective C.Está diseñado para que cada componente de la interfaz de usuario se extienda mediante delegación en lugar de subclases u otros medios.

Para obtener más información, recomiendo consultar lo que Apple tiene que decir sobre los delegados. aquí.

Tenía un proyecto que usaba win32 Python.

Por diversas razones, algunos módulos utilizaron odbc.py para acceder a la base de datos y otros módulos utilizaron pyodbc.py.

Había un problema cuando una función debía ser utilizada por ambos tipos de módulos.Se le pasó un objeto de conexión como argumento, pero luego tenía que saber si usar dbi.dbiDate o datetime para representar horas.

Esto se debía a que odbc.py esperaba, como valores en las declaraciones SQL, fechas como dbi.dbiDate, mientras que pyodbc.py esperaba valores de fecha y hora.

Una complicación adicional fue que los objetos de conexión creados por odbc.py y pyodbc.py no permitían establecer campos adicionales.

Mi solución fue envolver los objetos de conexión devueltos por odbc.odbc(...) y pyodbc.pyodbc(...) mediante una clase delegada, que contiene la función de representación de tiempo deseada como el valor de un campo adicional, y que delega todas las demás solicitudes de campo al objeto de conexión original.

Tenía la misma pregunta que tú y fui a este sitio en busca de una respuesta.

Aparentemente, no lo entendí mejor a pesar de que hojeé los ejemplos de este hilo.

Encontré un gran uso para los delegados ahora que leí: http://www.c-sharpcorner.com/UploadFile/thiagu304/passdata05172006234318PM/passdata.aspx

Esto puede parecer más obvio para los nuevos usuarios porque Forms es mucho más complicado para pasar valores que los sitios web ASP.NET con POST/GET (QueryString).

Básicamente defines un delegado que toma "Caja de texto texto" como parámetros.

// Formulario 1

// Class Property Definition
public delegate void delPassData(TextBox text);


// Click Handler
private void btnSend_Click(object sender, System.EventArgs e)
{
     Form2 frm= new Form2();
     delPassData del=new delPassData(frm.funData);
     del(this.textBox1);
     frm.Show();
}

// RESUMEN:Defina delegado, cree una nueva clase Form2, asigne la función funData() para delegar, pase su cuadro de texto al delegado.Muestra el formulario.

// Formulario2

public void passData(TextBox txtForm1)
{

     label1.Text = txtForm1.Text;
}

// RESUMEN:Simplemente tome TextBox txtForm1 como parámetros (como se define en su delegado) y asigne el texto de la etiqueta al texto del cuadro de texto.

Espero que esto aclare algún uso para los delegados :) ..

Una búsqueda rápida en Google me dio esto. http://en.wikipedia.org/wiki/Delegation_pattern .Básicamente, cada vez que usas un objeto que reenvía sus llamadas a otro objeto, estás delegando.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top