Dove uso i delegati?

Quali sono alcuni luoghi del mondo reale che richiedono delegati? Sono curioso di sapere quali situazioni o modelli sono presenti dove questo metodo è la soluzione migliore. Nessun codice richiesto.

Un delegato è un tipo denominato che definisce un particolare tipo di metodo. Proprio come una definizione di class espone tutti i membri per il tipo di object che definisce, il delegato definisce la firma del metodo per il tipo di metodo che definisce.

Sulla base di questa affermazione, un delegato è un puntatore a funzione e definisce l’aspetto di tale funzione.

Un grande esempio per un’applicazione del mondo reale di un delegato è il Predicato . Nell’esempio del collegamento, si noterà che Array.Find richiede all’array di cercare e quindi un predicato per gestire i criteri di cosa trovare. In questo caso passa un metodo ProductGT10 che corrisponde alla firma del predicato.

Come affermato in “Apprendimento C # 3.0: padroneggia i fondamenti di C # 3.0”

Scenario generale: quando un capo di stato muore, il Presidente degli Stati Uniti di solito non ha il tempo di partecipare personalmente al funerale. Invece, invia un delegato. Spesso questo delegato è il Vice Presidente, ma a volte il VP non è disponibile e il Presidente deve inviare qualcun altro, come il Segretario di Stato o anche la First Lady. Non vuole “bind” la sua autorità delegata a una singola persona; potrebbe debind questa responsabilità a chiunque sia in grado di eseguire il protocollo internazionale corretto.

Il Presidente definisce in anticipo quale sarà la delega della responsabilità (partecipare al funerale), quali saranno i parametri (condoglianze, parole gentili) e quale valore spera di ottenere (buona volontà). Assegna quindi una determinata persona a quella responsabilità delegata in “runtime” man mano che progredisce il corso della sua presidenza.

Nella programmazione dello scenario: spesso ti trovi di fronte a situazioni in cui devi eseguire una determinata azione, ma non sai in anticipo quale metodo, o anche quale object, vorresti chiamare per eseguirlo.

Ad esempio: un pulsante potrebbe non sapere quali oggetti o oggetti devono essere notificati. Invece di colbind il pulsante a un object specifico, connettere il pulsante a un delegato e quindi risolvere il delegato su un metodo particolare all’esecuzione del programma.

Un uso comune dei delegati per gli elenchi generici avviene tramite i delegati di Action (o il suo equivalente anonimo) per creare un’operazione foreach a una riga:

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

Trovo anche utile il delegato del predicato per la ricerca o la potatura di un elenco:

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

So che hai detto che non è necessario il codice, ma trovo più semplice esprimere la sua utilità tramite codice. 🙂

Binding Events to Event Handler è in genere la prima introduzione ai delegati … Potresti anche non sapere che li stavi utilizzando perché il delegato è incluso nella class EventHandler.

Se sei interessato a vedere come viene utilizzato il pattern Delegate nel codice del mondo reale, non guardare oltre Cocoa su Mac OS X. Cocoa è il toolkit UI preferito di Apple per la programmazione con Mac OS X, ed è codificato in Objective C. È progettato in modo tale che ogni componente dell’interfaccia utente sia destinato ad essere esteso tramite delega piuttosto che la sottoclass o altri mezzi.

Per ulteriori informazioni, ti consiglio di controllare cosa Apple ha da dire sui delegati qui .

Ho avuto un progetto che utilizzava Win32 Python.

A causa di vari motivi, alcuni moduli hanno utilizzato odbc.py per accedere al DB e altri moduli – pyodbc.py.

C’era un problema quando una funzione doveva essere utilizzata da entrambi i tipi di moduli. Aveva un object di connessione passato ad esso come argomento, ma poi doveva sapere se usare dbi.dbiDate o datetime per rappresentare i tempi.

Ciò era dovuto al fatto che odbc.py si aspettava, come valori nelle istruzioni SQL, date come dbi.dbiDate mentre pyodbc.py si aspettava valori datetime.

Un’ulteriore complicazione era che gli oggetti di connessione creati da odbc.py e pyodbc.py non permettevano di impostare campi aggiuntivi.

La mia soluzione era di avvolgere gli oggetti di connessione restituiti da odbc.odbc (…) e pyodbc.pyodbc (…) da una class delegata, che contiene la funzione di rappresentazione temporale desiderata come valore di un campo aggiuntivo, e quali delegati tutte le altre richieste di campo all’object di connessione originale.

Ho avuto la tua stessa domanda e sono andato su questo sito per una risposta.

Apparentemente, non l’ho capito meglio anche se ho sfogliato gli esempi su questo thread.

Ho trovato un ottimo uso per i delegati ora che ho letto: http://www.c-sharpcorner.com/UploadFile/thiagu304/passdata05172006234318PM/passdata.aspx

Questo potrebbe sembrare più ovvio per i nuovi utenti, perché i moduli è molto più complicato per trasmettere i valori rispetto ai siti Web ASP.NET con POST / GET (QueryString) ..

Fondamentalmente si definisce un delegato che accetta “TextBox text come parametri.

// 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(); } 

// SOMMARIO: Definisci delegato, crea un’istanza di una nuova class Form2, assegna la funzione funData () per debind, passa la tua casella di testo al delegato. Mostra il modulo.

// Form2

 public void passData(TextBox txtForm1) { label1.Text = txtForm1.Text; } 

// SOMMARIO: prendi semplicemente TextBox txtForm1 come parametri (come definito nel tuo delegato) e assegna il testo dell’etichetta al testo del textBox.

Spero che questo chiarisca un uso sui delegati 🙂 ..

Una rapida ricerca su google ha trovato questo http://en.wikipedia.org/wiki/Delegation_pattern . Fondamentalmente, ogni volta che usi un object che inoltra le sue chiamate a un altro object allora stai delegando.