Leçon 13 - Méthodes et Classes Avancées

P3 - Programmation avancée

Maîtrisez les concepts avancés de méthodes : surcharge, paramètres optionnels, méthodes d'extension et plus encore.

Surcharge de méthodes (Overloading)

La surcharge permet de définir plusieurs méthodes avec le même nom mais des paramètres différents. Le compilateur choisit la bonne version selon les arguments fournis.

Exemple de surcharge

C#
class Calculatrice { // Addition de deux entiers public int Additionner(int a, int b) { return a + b; } // Addition de trois entiers (surcharge) public int Additionner(int a, int b, int c) { return a + b + c; } // Addition de deux décimaux (surcharge) public double Additionner(double a, double b) { return a + b; } // Addition d'un tableau de nombres public int Additionner(params int[] nombres) { int somme = 0; foreach (int nombre in nombres) { somme += nombre; } return somme; } } // Utilisation static void TestSurcharge() { Calculatrice calc = new Calculatrice(); Console.WriteLine(calc.Additionner(5, 3)); // 8 (int, int) Console.WriteLine(calc.Additionner(5, 3, 2)); // 10 (int, int, int) Console.WriteLine(calc.Additionner(5.5, 3.2)); // 8.7 (double, double) Console.WriteLine(calc.Additionner(1, 2, 3, 4, 5)); // 15 (params) }

Paramètres optionnels et nommés

Paramètres optionnels

Les paramètres optionnels ont une valeur par défaut et peuvent être omis lors de l'appel.

C#
class GestionnaireEmail { public void EnvoyerEmail( string destinataire, string sujet, string corps, bool avecCopie = false, int priorite = 3 ) { Console.WriteLine($"Envoi à {destinataire}"); Console.WriteLine($"Sujet: {sujet}"); Console.WriteLine($"Corps: {corps}"); Console.WriteLine($"Copie: {avecCopie}, Priorité: {priorite}"); } } // Utilisation static void TestParametresOptionnels() { GestionnaireEmail gestionnaire = new GestionnaireEmail(); // Tous les paramètres gestionnaire.EnvoyerEmail("user@example.com", "Test", "Message", true, 5); // Paramètres optionnels omis gestionnaire.EnvoyerEmail("user@example.com", "Test", "Message"); // Paramètres nommés (dans n'importe quel ordre) gestionnaire.EnvoyerEmail( corps: "Message important", destinataire: "admin@example.com", sujet: "Urgent", priorite: 1 ); }

Paramètre params

Le mot-clé params permet de passer un nombre variable d'arguments sous forme de tableau.

C#
class OperationsMath { public int Maximum(params int[] nombres) { if (nombres.Length == 0) throw new ArgumentException("Au moins un nombre requis"); int max = nombres[0]; foreach (int nombre in nombres) { if (nombre > max) max = nombre; } return max; } public string Concatener(string separateur, params string[] mots) { return string.Join(separateur, mots); } } // Utilisation static void TestParams() { OperationsMath ops = new OperationsMath(); Console.WriteLine(ops.Maximum(5)); // 5 Console.WriteLine(ops.Maximum(5, 3, 9, 2)); // 9 Console.WriteLine(ops.Maximum(12, 7, 20, 15, 8)); // 20 Console.WriteLine(ops.Concatener("-", "a", "b", "c")); // a-b-c }

Méthodes d'extension

Les méthodes d'extension permettent d'ajouter de nouvelles méthodes à des types existants sans modifier leur code source.

C#
static class ExtensionsString { // Compter les mots dans une chaîne public static int CompterMots(this string texte) { if (string.IsNullOrWhiteSpace(texte)) return 0; return texte.Split(new[] { ' ', '\t', '\n' }, StringSplitOptions.RemoveEmptyEntries).Length; } // Capitaliser la première lettre public static string Capitaliser(this string texte) { if (string.IsNullOrEmpty(texte)) return texte; return char.ToUpper(texte[0]) + texte.Substring(1); } // Inverser la chaîne public static string Inverser(this string texte) { char[] tableau = texte.ToCharArray(); Array.Reverse(tableau); return new string(tableau); } } // Utilisation static void TestExtensions() { string phrase = "bonjour le monde"; Console.WriteLine($"Nombre de mots: {phrase.CompterMots()}"); // 3 Console.WriteLine($"Capitalisé: {phrase.Capitaliser()}"); // Bonjour le monde Console.WriteLine($"Inversé: {phrase.Inverser()}"); // ednom el ruojnob // Chaînage de méthodes d'extension string resultat = phrase.Capitaliser().Inverser(); Console.WriteLine($"Capitalisé puis inversé: {resultat}"); }

Modificateurs de paramètres: ref, out, in

Paramètre ref

Permet de passer une référence à une variable. La variable doit être initialisée avant l'appel.

C#
static void Echanger(ref int a, ref int b) { int temp = a; a = b; b = temp; } static void TestRef() { int x = 10, y = 20; Console.WriteLine($"Avant: x={x}, y={y}"); Echanger(ref x, ref y); Console.WriteLine($"Après: x={x}, y={y}"); // x=20, y=10 }

Paramètre out

Similaire à ref, mais la variable n'a pas besoin d'être initialisée. La méthode DOIT assigner une valeur.

C#
static bool DiviserEnQuotientEtReste(int dividende, int diviseur, out int quotient, out int reste) { if (diviseur == 0) { quotient = 0; reste = 0; return false; } quotient = dividende / diviseur; reste = dividende % diviseur; return true; } static void TestOut() { // Déclaration inline (C# 7.0+) if (DiviserEnQuotientEtReste(17, 5, out int q, out int r)) { Console.WriteLine($"17 / 5 = {q} reste {r}"); // 3 reste 2 } }

Paramètre in

Passe une référence en lecture seule (utile pour optimiser les performances avec de grandes structures).

C#
struct GrandeStructure { public int Valeur1 { get; set; } public int Valeur2 { get; set; } // ... beaucoup d'autres propriétés } static int Calculer(in GrandeStructure structure) { // structure est en lecture seule ici return structure.Valeur1 + structure.Valeur2; }

Exercice pratique

Créez un système de gestion de bibliothèque utilisant les concepts avancés.