¿Dónde uso delegados? [cerrado]


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

Author: Will, 2008-08-28

8 answers

Un delegado es un tipo nombrado que define un tipo particular de método. Al igual que una definición de clase establece todos los miembros para el tipo de objeto dado que define, el delegado establece la firma del método para el tipo de método que define.

Basado en esta instrucción, un delegado es un puntero de función y define cómo se ve esa función.

Un gran ejemplo para una aplicación en el mundo real de un delegado es el Predicado . En el ejemplo de la enlace, se dará cuenta de que Matriz.Find toma el array para buscar y luego un predicado para manejar los criterios de qué buscar. En este caso pasa un método ProductGT10 que coincide con la firma del Predicado.

 30
Author: Dale Ragan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-28 03:11:35

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 normalmente no tiene tiempo para asistir al funeral personalmente. En cambio, envía a un delegado. A menudo este delegado es el Vicepresidente, pero a veces el vicepresidente no está disponible y el El Presidente debe enviar a otra persona, como el Secretario de Estado o incluso la Primera Dama. Él no quiere "hardwire" su delegado autoridad a una sola persona; podría delegar esta responsabilidad a cualquiera que sea capaz de ejecutar el protocolo internacional correcto.

El Presidente define de antemano qué responsabilidad se delegará (asistir al funeral), qué parámetros se pasarán (condolencias, palabras amables), y qué valor espera recuperar (buena voluntad). Él entonces asigna a una persona en particular a esa responsabilidad delegada en "runtime" como el curso de su la presidencia progresa.

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 en avance a qué método, o incluso a qué objeto, querrá recurrir para ejecutarlo.

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

 146
Author: Atish Dipongkor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-04 00:35:59

Un uso común de 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 el Predicado delegado 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 requería código, pero me resulta más fácil expresar su utilidad a través del código. :)

 16
Author: Jon Limjap,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-28 02:32:42

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

 11
Author: FlySwat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-28 02:00:18

Si está interesado en ver cómo se usa el patrón Delegado en el código del mundo real, no busque más allá de Cocoa en Mac OS X. Cocoa es el kit de herramientas de interfaz de usuario preferido de Apple para programar bajo Mac OS X, y está codificado en Objective C. Está diseñado para que cada componente de interfaz de usuario esté destinado a ser extendido a través de delegación en lugar de subclasificación u otros medios.

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

 4
Author: spate,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-28 02:30:16

Tenía un proyecto que usaba win32 Python.

Debido a varias razones, algunos módulos utilizados odbc.py para acceder a la base de datos, y otros módulos - pyodbc.py.

Hubo un problema cuando una función necesitaba ser utilizada por ambos tipos de módulos. Tenía un objeto de conexión pasado a él como argumento, pero luego tenía que saber si usar dbi.dbiDate o datetime para representar tiempos.

Esto fue porque odbc.py esperado, como valores en sentencias SQL, fechas como dbi.dbiDato considerando pyodbc.py valores de fecha y hora esperados.

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

Mi solución fue envolver los objetos de conexión devueltos por odbc.odbc(...) y pyodbc.pyodbc(...) por una clase delegate, 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.

 4
Author: Omer Zak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-16 14:39:18

Tenía la misma pregunta que usted y fui a este sitio para una respuesta.

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

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

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

Básicamente se define un delegado que toma " Cuadro de texto texto" como parámetros.

// Form1

// 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: Definir delegado, crear una instancia de una nueva clase Form2, asignar la función funData() para delegar, pasar su cuadro de texto al delegado. Muestra el formulario.

// Form2

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 texto de etiqueta al texto de TextBox.

I espero que esto ilumine algún uso en los delegados :) ..

 4
Author: dezza,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-05-10 08:42:55

Una búsqueda rápida en Google llegó con 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.

 0
Author: martinatime,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-28 02:03:27