|
Présentation
Les délégués (delegates en anglais) sont une des spécificités
de C# par rapport à Java : le mot-clé delegate
offre la possibilité de créer des classes particulières, appelées
"délégations", dont les instances sont nommées "délégués".
Ces classes permettent d'établir un contrat entre l'émetteur
et le récepteur - en cela, elles sont proches des interfaces,
sauf qu'un délégué n'établit son contrat qu'avec une méthode
de la classe déléguée.
Que
sont-ce, donc, les délégués ? Ils sont définis comme des pointeurs
de fonction orientés objet et sans restriction de type (type-safe).
Plus simplement, ils sont souvent utilisés comme base de la
gestion d'événement au sein de .NET, car ils facilitent l'enregistrement
d'un événement. Ils mettent en place un système de rappel
(callback) beaucoup plus sécurisé, indiquant à une
fonction de référer à une autre. Plus que de simples pointeurs
de fonction, ils permettent de préciser le nombre d'arguments
à prendre en compte, et le type de chacun, ainsi que le type
de valeur retournée et les conventions d'appel.
Les délégués sont des méthodes appelables sans connaissance
préalable de l'objet cible. Lors de la création d'un événement,
l'émetteur ne peut pas forcément connaître l'objet/la méthode
qui va gérer son événement. Les délégués permettent de prendre
en charge ce rôle d'intermédiaire. Ils offrent aux développeurs
une méthode de dialogue entre objets, en permettant de fournir
en paramètre une fonction de même signature pour déléguer
l'exécution d'un morceau de code. Les délégués sont ainsi
très utilisés au sein de .NET, dans les cas où un composant
doit rappeler le composant qui l'utilise.
L'intérêt n'est pas forcément visible : au premier regard,
on pourrait comprendre que les délégués permettent d'appeler
une fonction à la place d'une autre, ce qui peut laisser sceptique.
Les délégués répondent pourtant à un besoin précis : prévoir
dans le code d'appeler une méthode, sans savoir lors de la
phase de programmation quelle sera cette méthode, celle-ci
n'étant précisée que lorsque le programme est lancé. Par exemple,
on peut avoir besoin de lancer un tri, mais ne pas être en
mesure de déterminer le type de tri (Bulle, Quick, Merge…)
avant que l'application ne tourne. L'idée est que ce
n'est plus l'objet initial qui gère l'activité, il peut la
déléguer à une autre fonction qui prend en charge l'ensemble
du processus (c'est la délégation asynchrone).
 |
Forum |
|
|
Réagissez
dans les forums
de JDN Développeurs
|
En pratique
Au sein du code C#, il faut commencer par établir un type
délégation (via le mot-clef delegate),
en précisant bien les arguments que la fonction déléguée doit
accepter. Il suffit ensuite de créer un objet du type créé,
en indiquant la fonction utilisée. Cette fonction est dès
lors disponible via le délégué. On peut comparer un délégué
à une interface ne déclarant qu'une méthode.
using System;
public class Test {
delegate void Deleg1();
delegate string Deleg2(string s);
static void f1() {
Console.WriteLine("Appel de f1.");
}
static string f2(string s)
{
string _s = string.Format("Appel de
f2 avec l'argument \"{0}\".", s);
Console.WriteLine(_s);
return _s;
}
public static void Main()
{
Deleg1 d1 = new Deleg1(f1);
d1;
Deleg2 d2 = new Deleg2(f2);
string s = d2("hello");
}
}
|