RunUO-FR
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
RunUO-FR

Forum de support pour RunUO en français.
 
AccueilAccueil  Dernières imagesDernières images  RechercherRechercher  S'enregistrerS'enregistrer  Connexion  
-20%
Le deal à ne pas rater :
-20% sur le Lot de 2 écrans PC GIGABYTE 27″ LED M27Q
429 € 539 €
Voir le deal

 

 Les Delegates

Aller en bas 
3 participants
AuteurMessage
Birfhum




Messages : 6
Date d'inscription : 07/09/2008

Les Delegates Empty
MessageSujet: Les Delegates   Les Delegates Icon_minipostedMar 9 Sep - 3:22

Les delegates

À priori, maîtrisez d'abords les Types, Méthodes (simples), Arguments, Instances.

Les delegates ont deux utilisations: Le passage de méthodes en arguments et les événements(ie le patron Observateur)


Le passage de méthodes en argument.

Un delegate est déclaré comme une méthode abstraite.

public delegate TypeRetour NomDelegate(ArgumentUn arg, [...]);

Voyons tout d'abord que "delegate" remplace le "abstract" qui serait normalement vu. Pour le reste, la formulation est la même que celle d'une méthode normale, mais avec un ";" à la fin, c'est à dire pas de corps entre { }.

Maintenant, toute les classes qui importeront(à l'aide de using) la classe où le delegate a été déclaré pourront profiter de celui-ci. Cependant, l'envoi d'une méthode doit être exécuté d'une certaine manière...
Il faut instancier le delegate comme un nouvel objet.

Code:
NomDelegate del = new NomDelegate(nomMethode);


Dans le but de clarifier tout ceci, mettons l'exemple en application; vous verrez ceci est plus clair.
Code:
public delegate int BaseHandler(int option, object argument);

//Traiter une demande selon l'option paire.
public static int TraiterDemande(int option, BaseHandler methode)
{
   //Envoyer des options différents si c'est paire ou pas
   return methode(((option % 2 == 0)?5:0), null);
}
Ici, la méthode TraiterDemande demande pour arguments un int et un objet de type BaseHandler, notre delegate.

Dans la classe qui apellera ce delegate...
Code:
// Classe simple qui sert à expliquer comment écrire un handler
public int HandlerSpecialiser(int option, object argument)
{
   return option;
}

public void toto()
{
   int total = ClasseEnHaut.TraiterDemande(5, new ClasseEnHaut.BaseHandler(HandlerSpecialiser));
   Console.WriteLine(total);
}

Ici, on appelle TraiterDemande, en fournissant pour argument une nouvelle instance de BaseHandler qui elle même prend pour argument la méthode HandlerSpecialiser.


Ce type de delegate est donc l'envoie par argument de la méthode à employer. Voic un exemple où je l'ai employé:

Pour une interraction de base de donnée, j'envois une requête vers la base de données puis reçoit les données. Après le traitement de ces dernières, je ferme la connection. Je veux que la méthode soit assez généraliste pour satisfaire tout type de requête(get, set, update, delete).
Je crée donc ma connection et envoie ma requête. Après avoir obtenu les données de la requête, j'apelle mon delegate pour qu'il traite ses dernières(changer leur format, les stocker ou autre). Après ce traitement, je ferme ma connection.


Les événements

Les delegates, comme vous l'avez vu, permettent de voir des méthodes en tant que simples variables... Alors, suivant cette idée, pouvons-nous additionner des méthodes et quel en sera les résultats?

Il est possible d'avoir un objet de type delegate qui possèdera plusieurs autres delegate concrêts. Il faut d'abords créer la variable comme suit.

Code:
public delegate int BaseHandler(object argument);
public BaseHandler operationHandler = null;

Ensuite l'ajout de méthodes dans ce delegate est très facile, il suffit de faire un += de la méthode. Il est aussi possible de retirer les delegates avec un -=.
Code:
operationHandler += new BaseHandler(MethodeValide);
operationHandler(null);


Ces opérations semblent complexe, mais c'est très simple et très très pratique. Plutôt que de vous écrire un exemple, je vous réfère vers le patron de conception Observateur, où les méthodes recevant les listeners sont une application concrète des delegate. Si ceci n'est pas assez clair, je donnerai un exemple concrêt ici.


Dernière édition par Birfhum le Mar 9 Sep - 21:04, édité 1 fois
Revenir en haut Aller en bas
Gargouille




Messages : 97
Date d'inscription : 02/09/2008

Les Delegates Empty
MessageSujet: Re: Les Delegates   Les Delegates Icon_minipostedMar 9 Sep - 7:26

Merci. Wink

J'ai rajouté deux lignes en italique, à toi de voir. Et aussi, pourrais-tu détailler encore le premier exemple, comment ça fonctionne, à quoi ça sert. J'ai bien du mal avec cette notion Embarassed
Revenir en haut Aller en bas
Gargouille




Messages : 97
Date d'inscription : 02/09/2008

Les Delegates Empty
MessageSujet: Re: Les Delegates   Les Delegates Icon_minipostedDim 5 Oct - 22:01

Hop, un lien vers le site Developpez.com, sur un article de Messieurs Frédéric Cantenot et Olivier Delmotte.

Par ici
Revenir en haut Aller en bas
tresorunikin




Messages : 3
Date d'inscription : 17/01/2009

Les Delegates Empty
MessageSujet: Re: Les Delegates   Les Delegates Icon_minipostedSam 17 Jan - 2:59

Merci pour les delegates. Mais je ne sais pas réellement leur importance a part celui d'encombrer nos sources. en plus ils ressemblent aux fameux pointeurs C++
Revenir en haut Aller en bas
Contenu sponsorisé





Les Delegates Empty
MessageSujet: Re: Les Delegates   Les Delegates Icon_miniposted

Revenir en haut Aller en bas
 
Les Delegates
Revenir en haut 
Page 1 sur 1

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
RunUO-FR :: Tutoriaux Scripts :: Tutoriaux C#-
Sauter vers: