POO C# - 1. Delegates
Après cette quête tu sauras comment passer une méthode en argument d'une autre
Objectifs
- Comprendre le principe d'une méthode déléguée
- Savoir affecter une delegate
Une méthode est un objet
C# étant un langage orienté-objet, il est logique d'imaginer que toutes les entités que manipulent C# sont des objets ! Et c'est d'ailleurs vrai, puisque même les méthodes sont des objets.
Ca veut dire qu'une méthode a des méthodes et des attributs ?
Oui, mais inaccessibles en l'état. On peut accéder aux attributs d'une méthode en tant qu'objet grâce à une technique appelée la réflexion. Mais ce n'est pas le sujet du document courant.
Le premier avantage du fait qu'une méthode soit un objet est le fait qu'il est possible de passer une méthode en argument d'une autre. Rien que ça !
Et ça change quoi ?
Ca peut totalement changer notre manière de concevoir une classe: on peut imaginer qu'une classe ait besoin d'appeler une méthode dont elle ne connaît pas l'implémentation. On peut alors lui spécifier l'implémentation d'une méthode au courant de l'exécution d'un programme, ce qui peut-être très pratique.
Ainsi, il possible qu'une méthode prenne en paramètre une autre méthode. Même si ce n'est pas évident à constater, cela ouvre de nombreuses portes.
Ok, mais dans quel cas ça peut être utile ?
Il y a beaucoup de cas d'utilisations des delegates, qui sont d'ailleurs le concept de callbacks mais à la sauce Microsoft.
-
Une méthode asynchrone réalise un traitement long. La seule manière qu'à cette méthode de spécifier qu'elle a terminé sont traitement est d'utiliser une delegate prévenant un autre objet.
-
On veut pouvoir modifier le comportement à la fin d'un traitement. La librairie effectuant le traitement ne nous appartient pas mais elle rend possible la personnalisation des traitements via un argument qui prend un delegate.
Ressources
Syntaxe
Il est très simple de déclarer une nouvelle delegate:
class Program
{
public static void Main(string[] args)
{
Calculate calc = Add;
Console.WriteLine(calc(2, 1));
calc = Subtract;
Console.WriteLine(calc(2, 1));
}
public delegate int Calculate(int x, int y);
public static int Add(int x, int y)
{
return x + y;
}
public static int Subtract(int x, int y)
{
return x - y;
}
}
Décortiquons un peu le code ci-dessus:
-
La méthode Main instancie un objet de type
Calculatedont le nom estcalcCalculateest une méthode déléguée dont la signature est fournie par la classe Program, elle renvoie un entier et en prend deux en argument
-
calcest affecté à une méthode:AddAddrenvoie l'addition de deux entiers, sa signature est la même que celle deCalculate
-
On affiche le retour de l'exécution de
calc- Cela nous renvoie l'addition de deux et de un, ce qui donne trois. 3 sera donc affiché à l'écran.
-
calcest affecté à une autre méthode:SubtractSubtractrenvoie la soustraction de deux entiers, sa signature est la même que celle deCalculate
-
On affiche le retour de l'exécution de
calc:- Est affiché 1 puisque
Subtract(2, 1)renvoie 1
- Est affiché 1 puisque
Nous venons d'apprendre une méthode nous permettant d'affecter une méthode à une variable. Cela décuple grandement nos possibilités !
Ressources
Challenge
Challenge
Plusieurs monnaies
Ta mission va être de fournir un code qui affiche de plusieurs manières une somme d'argent. Je veux qu'une delegate ShowMoney affiche une fois un montant en dollars ($), et l'autre et en euro (€). Pas besoin de prendre en compte le taux de change, uniquement le signe suffixant les montants.
Critères de validation
- Un lien vers la solution GitHub est donné
- Une méthode delegate ShowMoney affiche une somme d'argent en €
- La même delegate ShowMoney affiche la même somme d'argent en $