Domanda

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

È stato utile?

Soluzione

Un delegato è un tipo denominato che definisce un particolare tipo di metodo.Proprio come una definizione di classe espone tutti i membri per un dato tipo di oggetto che definisce, il delegato espone 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 quella funzione.

Un ottimo esempio di un'applicazione nel mondo reale di un delegato è il Predicato.Nell'esempio del collegamento, lo noterai Array.Trova prende l'array da 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.

Altri suggerimenti

Come affermato in "Apprendimento su C# 3.0:Padroneggia i fondamenti di C# 3.0"

Scenario generale: Quando un capo di stato muore, il presidente degli Stati Uniti in genere non ha il tempo di frequentare personalmente il funerale.Invece, invia un delegato.Spesso questo delegato è il vicepresidente, ma a volte il vicepresidente non è disponibile e il presidente deve inviare qualcun altro, come il segretario di stato o persino la first lady.Non vuole "duro" la sua autorità delegata a una sola persona;Potrebbe delegare questa responsabilità a chiunque sia in grado di eseguire il protocollo internazionale corretto.

Il presidente definisce in anticipo quale responsabilità sarà delegata (partecipare al funerale), quali parametri saranno approvati (condoglianze, parole gentili) e quale valore spera di recuperare (buona volontà).Quindi assegna una persona in particolare a tale responsabilità delegata in "Runtime" man mano che il corso della sua presidenza avanza.

Nello scenario di programmazione: Spesso si trova di fronte a situazioni in cui devi eseguire un'azione particolare, ma non sai in anticipo quale metodo, o anche quale oggetto, vorrai invocare per eseguirlo.

Per esempio: Un pulsante potrebbe non sapere quale oggetto o quali oggetti devono essere notificati.Invece di cablaggio del pulsante su un oggetto particolare, collegherai il pulsante a un delegato e quindi risolverà quel delegato a un metodo particolare quando il programma esegue.

Un uso comune dei delegati per elenchi generici è tramite delegati di azione (o il suo equivalente anonimo) per creare un'operazione foreach di una riga:

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

Trovo anche il delegato Predicato molto utile nella ricerca o nella potatura di una lista:

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

So che hai detto che non è richiesto alcun codice, ma trovo più semplice esprimerne l'utilità tramite codice.:)

L'associazione di eventi ai gestori eventi rappresenta in genere la prima introduzione ai delegati... Potresti anche non sapere che li stavi utilizzando perché il delegato è racchiuso nella classe EventHandler.

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

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

Avevo un progetto che utilizzava win32 Python.

Per vari motivi, alcuni moduli utilizzavano odbc.py per accedere al DB e altri moduli - pyodbc.py.

Si è verificato un problema quando una funzione doveva essere utilizzata da entrambi i tipi di moduli.Gli veniva passato un oggetto connessione come argomento, ma poi doveva sapere se utilizzare dbi.dbiDate o datetime per rappresentare l'ora.

Questo perché 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 consentivano di impostare campi aggiuntivi.

La mia soluzione era racchiudere gli oggetti di connessione restituiti da odbc.odbc(...) e pyodbc.pyodbc(...) da una classe delegata, che contiene la funzione di rappresentazione temporale desiderata come valore di un campo aggiuntivo e che delega tutte le altre richieste di campo all'oggetto di connessione originale.

Avevo la tua stessa domanda e sono andato su questo sito per trovare una risposta.

A quanto pare non ho capito meglio anche se ho sfogliato gli esempi in questo thread.

Ho trovato un ottimo utilizzo 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é Forms è molto più complicato nel passare valori rispetto ai siti Web ASP.NET con POST/GET (QueryString) ..

Fondamentalmente definisci un delegato che prende "Casella di testo testo" come parametri.

// Modulo1

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

// RIEPILOGO:Definisci il delegato, crea un'istanza della nuova classe Form2, assegna la funzione funData() al delegato, passa la tua casella di testo al delegato.Mostra il modulo.

// Modulo2

public void passData(TextBox txtForm1)
{

     label1.Text = txtForm1.Text;
}

// RIEPILOGO:Prendi semplicemente TextBox txtForm1 come parametri (come definito nel tuo delegato) e assegna il testo dell'etichetta al testo di textBox.

Spero che questo illumini qualche utilizzo sui delegati :) ..

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top