Je ne comprends pas quel est le rôle réel d'un délégué?
On m'a posé cette question plusieurs fois au cours de mes entretiens, mais je ne pense pas que les intervieweurs aient été satisfaits de ma réponse.
Quelqu'un peut-il me donner la meilleure définition, en une phrase, avec un exemple pratique?
Réponses:
J'aime penser à un délégué comme "un pointeur vers une fonction". Cela remonte à l'époque C, mais l'idée tient toujours.
L'idée est que vous devez être capable d'appeler un morceau de code, mais ce morceau de code que vous allez appeler n'est pas connu avant l'exécution. Vous utilisez donc un «délégué» à cette fin. Les délégués sont utiles pour des choses comme les gestionnaires d'événements, etc., où vous faites différentes choses en fonction de différents événements, par exemple.
Voici une référence pour C # que vous pouvez consulter:
En C #, par exemple, disons que nous avons eu un calcul que nous voulions faire et que nous voulions utiliser une méthode de calcul différente que nous ne connaissons pas avant l'exécution. Nous pourrions donc avoir quelques méthodes de calcul comme celle-ci:
Nous pourrions déclarer une signature de délégué comme ceci:
Et puis nous pourrions déclarer une méthode qui prend le délégué comme paramètre comme ceci:
Et nous pourrions appeler la
CalcMyTotal
méthode en passant la méthode déléguée que nous voulions utiliser.la source
Foo
à un délégué appellerathis.Foo()
plutôt qu'une fonction statique comme le ferait un pointeur de fonction (en C, vous avez souvent unvoid*
paramètre supplémentaire pour passerthis
au pointeur de fonction)un délégué est simplement un pointeur de fonction.
mettez simplement vous attribuez la méthode que vous souhaitez exécuter votre délégué. puis plus tard dans le code, vous pouvez appeler cette méthode via Invoke.
du code pour démontrer (écrit ceci de mémoire afin que la syntaxe puisse être désactivée)
la source
Pris d'ici
Ou, comme pseudo-exemple simple: quelque chose envoie une requête à object1. object1 transmet ensuite la demande et lui-même à object2 - le délégué. object2 traite la demande et effectue un certain travail. (note: le lien ci-dessus donne de bons exemples)
la source
Pensez au délégué comme à une implémentation simplifiée du modèle de commande.
la source
Un délégué est un objet qui peut faire référence à une méthode. Ainsi, lorsque nous créons un délégué, nous créons un objet pouvant contenir une référence à une méthode. De plus, la méthode peut être appelée via cette référence. Ainsi, un délégué peut appeler la méthode à laquelle il fait référence. Le principal avantage d'un délégué est qu'il nous permet de spécifier un appel à une méthode, mais la méthode réellement invoquée est déterminée au moment de l'exécution et non au moment de la compilation.
Délégué simple
http://knowpacific.wordpress.com/2012/01/26/delegate/
la source
Ici, je vais expliquer les délégués, les délégués multicast et leur utilisation. Delegate est un type qui contient la ou les méthodes de référence dans un objet. Il est également appelé pointeur de fonction de type sécurisé. Nous pouvons dire qu'un délégué est un type qui définit une signature de méthode.
Lorsque vous instanciez un délégué, vous pouvez associer son instance à n'importe quelle méthode avec une signature compatible. Vous pouvez invoquer (ou appeler) la méthode via l'instance de délégué. Les délégués sont utilisés pour passer des méthodes comme arguments à d'autres méthodes. Les gestionnaires d'événements ne sont rien de plus que des méthodes qui sont appelées via des délégués. Les avantages de l'utilisation des délégués sont: Encapsulation de l'appel de la méthode à partir de l'appelant L'utilisation efficace du délégué améliore les performances de l'application Utilisé pour appeler une méthode de manière asynchrone. Certaines propriétés des délégués sont
public delegate type_of_delegate delegate_name () // Déclaration
L'exemple suivant montre une opération de délégué:
Qu'est-ce que le délégué de multidiffusion?
C'est un délégué qui détient la référence de plus d'une méthode. Les délégués de multidiffusion doivent contenir uniquement des méthodes qui retournent void, sinon il y a une exception d'exécution.
Ici, le délégué est ajouté à l'aide de l'opérateur + = et supprimé à l'aide de l'opérateur - =.
Les types de délégués sont dérivés de la classe Delegate dans le .NET Framework. Les types de délégués sont scellés - ils ne peuvent pas être dérivés. Étant donné que le délégué instancié est un objet, il peut être passé en tant que paramètre ou affecté à une propriété. Cela permet à une méthode d'accepter un délégué en tant que paramètre et d'appeler le délégué ultérieurement. C'est ce qu'on appelle un rappel asynchrone.
la source
Une bonne explication et une mise en œuvre pratique du modèle Delegate peuvent être trouvées dans les classes de transfert de collections Google (également, le modèle Decorator).
la source
Dans la communication événementielle, l'expéditeur ne sait pas quel objet gérera l'événement. Le délégué est le type qui contient la référence de la méthode. Delegate a une signature et contient une référence à la méthode qui correspond à sa signature, donc Delegate est comme un pointeur de fonction de type sécurisé.
button1.Click + = new System.EventHandler (button1_Click) System.EventHandler est déclaré en tant que délégué ici Dans .net Events travaille sur le concept de Delegate (comme Button Click)
Delegate est utilisé lorsque vous ne savez pas quel code appeler au moment de l'exécution Donc, à ce moment-là, Delegate est utilisé pour gérer les événements
http://msdn.microsoft.com/en-us/library/ms173171(v=vs.80).aspx
la source
Un objet délégué est un objet qu'un autre objet consulte lorsque quelque chose se produit dans cet objet. Par exemple, votre réparateur est votre délégué si quelque chose arrive à votre voiture. vous allez chez votre réparateur et lui demandez de réparer la voiture pour vous (bien que certains préfèrent réparer la voiture eux-mêmes, auquel cas ils sont leur propre délégué pour leur voiture).
la source
Un délégué est un objet qui représente un pointeur vers une fonction. Cependant, ce n'est pas un pointeur de fonction ordinaire en ce sens qu'il:
1) Est orienté objet
2) Est de type sécurisé, c'est-à-dire qu'il ne peut pointer que sur une méthode et que vous ne pouvez pas lire l'adresse mémoire brute vers laquelle il pointe
3) Est fortement typé. Il ne peut pointer que vers des méthodes qui correspondent à ses signatures.
4) Peut pointer vers plus d'une méthode en même temps.
la source
Les délégués sont principalement utilisés lors d'événements.
Le besoin est:
Vous ne souhaitez pas exécuter un morceau de code au moment où vous exécutez le programme. Après avoir exécuté le programme, vous souhaitez exécuter ce morceau de code chaque fois qu'un événement se produit.
Exemple :
C'est ce qu'ils disent, vous ne savez pas quelle méthode invoquera au moment de la compilation. vous ne le savez qu'au moment de l'exécution, c'est-à-dire en cliquant sur le bouton.
Sans délégués, aucune programmation d'interface utilisateur n'est possible. Parce que vous exécutez du code chaque fois que l'utilisateur crée des événements en cliquant sur un bouton, en tapant dans la zone de texte, en sélectionnant un élément de liste déroulante, etc.
la source
Un délégué est un élément auquel une tâche est déléguée. L'objectif principal de la délégation est de découpler le code et de permettre une plus grande flexibilité et une plus grande réutilisation.
En programmation, et en particulier en programmation orientée objet, cela signifie que lorsqu'une méthode est appelée pour effectuer un travail, elle passe le travail à la méthode d'un autre objet auquel elle fait référence. La référence pourrait pointer vers l'objet que nous souhaitons, tant que l'objet est conforme à un ensemble prédéfini de méthodes. Nous l'appelons "programmation vers une interface" (par opposition à la programmation vers une implémentation de classe concrète). Une interface est essentiellement un modèle générique et n'a pas d'implémentation; cela signifie simplement une recette, un ensemble de méthodes, des conditions préalables et des post-conditions (règles).
Exemple simple:
Maintenant, vous voyez que je peux utiliser n'importe quelle implémentation que je veux à tout moment sans changer le code dans SomeCaller parce que le type qui
doIt()
est passé n'est pas concret mais plutôt abstrait puisqu'il s'agit d'une interface. Dans le monde Java, cela s'exprime souvent dans le paradigme du service où vous appelez un service (un objet s'annonçant comme un service via une interface spécifique) et le service appelle ensuite les délégués pour l'aider à faire son travail. Les méthodes du service sont nommées comme des tâches grossières (makePayment (), createNewUser (), etc.), tandis qu'en interne, il fait beaucoup de travail concret par délégation, les types des délégués étant des interfaces au lieu des implémentations concrètes.(NB: la manière dont une implémentation est attribuée dépasse le cadre de ce thread. Inversion de recherche de contrôle et injection de dépendances.)
la source
Bien qu'il ne s'agisse pas vraiment d'un "pointeur de fonction", un délégué peut ressembler à un langage dynamique comme PHP:
ou en JavaScript, vous pouvez faire quelque chose comme:
la source