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énementsLes 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.