Où dois-je utiliser les délégués? [fermé]

109

Quels sont les endroits du monde réel qui appellent des délégués? Je suis curieux de savoir quelles situations ou quels modèles sont présents où cette méthode est la meilleure solution. Aucun code requis.

slipsec
la source

Réponses:

33

Un délégué est un type nommé qui définit un type particulier de méthode. Tout comme une définition de classe présente tous les membres pour le type d'objet donné qu'elle définit, le délégué présente la signature de méthode pour le type de méthode qu'il définit.

Sur la base de cette instruction, un délégué est un pointeur de fonction et il définit à quoi ressemble cette fonction.

Un excellent exemple pour une application réelle d'un délégué est le prédicat . Dans l'exemple du lien, vous remarquerez que Array.Find prend le tableau pour rechercher, puis un prédicat pour gérer les critères de recherche. Dans ce cas, il passe une méthode ProductGT10 qui correspond à la signature Predicate.

Dale Ragan
la source
154

Comme indiqué dans "Apprentissage de C # 3.0: maîtrisez les principes fondamentaux de C # 3.0"

Scénario général: Lorsqu'un chef d'État décède, le président des États-Unis n'a généralement pas le temps d'assister personnellement aux funérailles. Au lieu de cela, il envoie un délégué. Souvent, ce délégué est le vice-président, mais parfois le vice-président n'est pas disponible et le président doit envoyer quelqu'un d'autre, comme le secrétaire d'État ou même la première dame. Il ne veut pas «câbler» son autorité déléguée à une seule personne; il pourrait déléguer cette responsabilité à quiconque est en mesure d'exécuter le protocole international approprié.

Le président définit à l'avance quelle responsabilité sera déléguée (assister aux funérailles), quels paramètres seront adoptés (condoléances, paroles aimables) et quelle valeur il espère récupérer (bonne volonté). Il affecte ensuite une personne en particulier à cette responsabilité déléguée au «moment de l'exécution» au fur et à mesure de l'avancement de sa présidence.

En programmation Scénario: Vous êtes souvent confronté à des situations où vous devez exécuter une action particulière, mais vous ne savez pas à l'avance quelle méthode, ni même quel objet, vous voudrez faire appel pour l'exécuter.

Par exemple: un bouton peut ne pas savoir quel ou quels objets doivent être notifiés. Plutôt que de câbler le bouton à un objet particulier, vous connecterez le bouton à un délégué, puis résoudrez ce délégué à une méthode particulière lorsque le programme s'exécutera.

Atish Dipongkor - MVP
la source
1
Pourquoi ne pas simplement utiliser des fonctions / lambdas anonymes alors?
Pacerier
5
@Pacerier C'est une réponse tardive et vous avez peut-être découvert la réponse, mais pour le bien des autres lecteurs qui trouvent ceci: une fonction anonyme est un type de délégué.
Anthony
10
@ Anthony + Pacerier: Une méthode anoymeuse n'est PAS un délégué. Une méthode anonyme est un morceau de code. Un délégué est un pointeur qui pointe vers ce morceau de code. Vous ne pouvez pas avoir une méthode anonyme sans un délégué qui pointe dessus, sinon elle ne serait jamais appelée. Un lambda est un opérateur utilisé pour construire des expressions lambda. Les expressions lambda aboutissent principalement à des méthodes anonymes qui seront pointées par ... un délégué.
Martin Mulder
C'est idiot, mais je créerais simplement une instruction If ElseIf si je ne connaissais pas l'utilisation lorsque le bouton était enfoncé. J'ai dit stupide moi.
JustJohn
@Pacerier méthode anonyme introduite en C # 2.0 et Lambda introduite en C # 3.0 si Lambda avait été introduite en premier, il n'y aurait jamais eu de méthodes anonymes et même de délégué!
AminM
18

Une utilisation courante des délégués pour les listes génériques consiste à utiliser des délégués d'action (ou son équivalent anonyme) pour créer une opération foreach sur une ligne:

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

Je trouve également le délégué Predicate très utile pour rechercher ou élaguer une liste:

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

Je sais que vous avez dit qu'aucun code n'est requis, mais je trouve plus facile d'exprimer son utilité via le code. :)

Jon Limjap
la source
13

Lier des événements aux gestionnaires d'événements est généralement votre première introduction aux délégués ... Vous ne savez peut-être même pas que vous les utilisiez car le délégué est enveloppé dans la classe EventHandler.

FlySwat
la source
5

Si vous souhaitez voir comment le modèle Delegate est utilisé dans le code du monde réel, ne cherchez pas plus loin que Cocoa sur Mac OS X. Cocoa est la boîte à outils d'interface utilisateur préférée d'Apple pour la programmation sous Mac OS X, et est codé en Objective C. C'est conçu pour que chaque composant de l'interface utilisateur soit destiné à être étendu par délégation plutôt que par sous-classement ou par d'autres moyens.

Pour plus d'informations, je vous recommande de consulter ce qu'Apple a à dire sur les délégués ici .

série
la source
5

J'avais un projet qui utilisait win32 Python.

Pour diverses raisons, certains modules ont utilisé odbc.py pour accéder à la base de données et d'autres modules - pyodbc.py.

Il y avait un problème lorsqu'une fonction devait être utilisée par les deux types de modules. Il avait un objet de connexion qui lui était passé comme argument, mais il devait ensuite savoir s'il fallait utiliser dbi.dbiDate ou datetime pour représenter les heures.

En effet, odbc.py attendait, en tant que valeurs dans les instructions SQL, que les dates soient dbi.dbiDate tandis que pyodbc.py attendait des valeurs datetime.

Une autre complication était que les objets de connexion créés par odbc.py et pyodbc.py ne permettaient pas de définir des champs supplémentaires.

Ma solution était d'encapsuler les objets de connexion retournés par odbc.odbc (...) et pyodbc.pyodbc (...) par une classe déléguée, qui contient la fonction de représentation temporelle souhaitée comme valeur d'un champ supplémentaire, et qui délègue toutes les autres demandes de champ à l'objet de connexion d'origine.

Omer Zak
la source
5

J'ai eu la même question que vous et je suis allé sur ce site pour une réponse.

Apparemment, je ne l'ai pas mieux compris même si j'ai parcouru les exemples sur ce fil.

J'ai trouvé une grande utilité pour les délégués maintenant que j'ai lu: http://www.c-sharpcorner.com/UploadFile/thiagu304/passdata05172006234318PM/passdata.aspx

Cela peut sembler plus évident pour les nouveaux utilisateurs, car Forms est beaucoup plus compliqué à transmettre des valeurs que les sites Web ASP.NET avec POST / GET (QueryString).

Fondamentalement, vous définissez un délégué qui prend "TextBox text " comme paramètres.

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

// Résumé: définissez le délégué, instanciez la nouvelle classe Form2, affectez la fonction funData () au délégué, passez votre textBox au délégué. Montrez le formulaire.

// Form2

public void passData(TextBox txtForm1)
{

     label1.Text = txtForm1.Text;
}

// RÉSUMÉ: prenez simplement TextBox txtForm1 comme paramètres (comme défini dans votre délégué) et affectez le texte d'étiquette au texte de textBox.

J'espère que cela éclairera une certaine utilité sur les délégués :) ..

dezza
la source
Soit la méthode de classe Form2 doit être nommée funData (au lieu de passData), soit l'affectation de fonction Form1 doit être nommée frm.passData (au lieu de frm.funData).
ethan
1

Une recherche rapide sur Google a abouti à ce http://en.wikipedia.org/wiki/Delegation_pattern . Fondamentalement, chaque fois que vous utilisez un objet qui transfère ses appels à un autre objet, vous déléguez.

martinatime
la source