Génériques (Classes et Méthodes)
Fait partie de la section Programmation Orientée Objet du Journey C# de Coddy. Leçon 42 sur 70.
Les génériques vous permettent d’écrire des classes et des méthodes qui fonctionnent avec n’importe quel type de données tout en garantissant la sécurité des types. Au lieu d’écrire des classes distinctes pour IntList, StringList et DoubleList, vous écrivez une seule classe générique qui les prend toutes en charge.
Une classe générique utilise un paramètre de type, généralement nommé T, placé entre des chevrons :
public class Box<T>
{
private T content;
public void Store(T item) => content = item;
public T Retrieve() => content;
}
// Utilisation avec différents types
Box<int> intBox = new Box<int>();
intBox.Store(42);
Box<string> stringBox = new Box<string>();
stringBox.Store("Hello");Lorsque tu crées Box<int>, le compilateur remplace chaque T par int. Cela permet de vérifier les types à la compilation : tu ne peux pas stocker accidentellement une chaîne de caractères dans une boîte int.
Les méthodes génériques fonctionnent de manière similaire et permettent à une seule méthode de travailler avec différents types :
public static void Swap<T>(ref T a, ref T b)
{
T temp = a;
a = b;
b = temp;
}
int x = 1, y = 2;
Swap(ref x, ref y); // x=2, y=1Le compilateur déduit le type à partir des arguments, donc tu n’as pas besoin d’écrire explicitement Swap<int>. Les génériques sont à la base de collections comme List<T> et Dictionary<TKey, TValue>, ce qui permet d’écrire du code réutilisable et sûr du point de vue des types.
Défi
FacileConstruisons un système générique Storage<T> capable de contenir et de gérer des éléments de n’importe quel type. Tu vas créer une classe conteneur réutilisable qui montre toute la puissance des génériques : écris-la une fois, utilise-la avec des entiers, des chaînes de caractères ou tout autre type !
Tu vas organiser ton code dans deux fichiers :
Storage.cs: crée une classe génériqueStorage<T>dans l’espace de nomsDataStorage. Ton conteneur de stockage doit :- comporter un tableau privé de type
Tpour stocker les éléments et une propriétéCountqui suit le nombre d’éléments stockés - accepter une capacité dans son constructeur afin d’initialiser le tableau interne
- comporter une méthode
Add(T item)qui ajoute un élément s’il y a de la place - comporter une méthode
Get(int index)qui renvoie l’élément à l’index spécifié - comporter une méthode
GetAll()qui renvoie tous les éléments stockés, joints par", "
- comporter un tableau privé de type
Program.cs: dans ton fichier principal, montre ta classe générique en action avec deux types différents. Crée unStorage<int>et unStorage<string>, ajoute des éléments dans chacun et montre que la même classe fonctionne parfaitement avec les deux types.
Tu recevras quatre entrées :
- Le premier entier à stocker
- Le deuxième entier à stocker
- La première chaîne de caractères à stocker
- La deuxième chaîne de caractères à stocker
Crée un stockage d’entiers de capacité 5 et un stockage de chaînes de caractères de capacité 5. Ajoute les deux entiers au stockage d’entiers et les deux chaînes de caractères au stockage de chaînes.
Affiche la sortie dans ce format :
Int storage: {GetAll()}
Int count: {Count}
First int: {Get(0)}
String storage: {GetAll()}
String count: {Count}
First string: {Get(0)}Par exemple, si les entrées sont 42, 100, Hello et World, la sortie devrait être :
Int storage: 42, 100
Int count: 2
First int: 42
String storage: Hello, World
String count: 2
First string: HelloRemarque que tu écris la classe Storage<T> une seule fois, mais qu’elle fonctionne parfaitement avec int et string : c’est toute la magie des génériques ! Le compilateur garantit la sécurité des types, donc tu ne peux pas ajouter accidentellement une chaîne de caractères à ton stockage d’entiers.
Essayez vous-même
using System;
using DataStorage;
class Program
{
public static void Main(string[] args)
{
// Lire les entrées
int num1 = Convert.ToInt32(Console.ReadLine());
int num2 = Convert.ToInt32(Console.ReadLine());
string str1 = Console.ReadLine();
string str2 = Console.ReadLine();
// TODO: Créer un Storage<int> d’une capacité de 5
// TODO: Ajouter les deux entiers au stockage des entiers
// TODO: Créer un Storage<string> d’une capacité de 5
// TODO: Ajouter les deux chaînes au stockage des chaînes
// TODO: Afficher le résultat dans le format demandé
// Int storage: {GetAll()}
// Nombre d’entiers : {Count}
// Premier entier : {Get(0)}
// String storage: {GetAll()}
// String count: {Count}
// First string: {Get(0)}
}
}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Programmation Orientée Objet
1Fondamentaux de la POO
Fichiers externesEspaces de noms et directivesIntro aux classes et objetsLe mot-clé 'this'Méthodes et paramètresChamps vs PropriétésConstructeursInitialiseurs d'objetsRécapitulatif - Calculatrice simple4Héritage
Syntaxe de base de l'héritage (:)Le mot-clé 'base'Mots-clés Virtual & OverrideClasses scelléesLa classe de base 'object'Récapitulatif - Hiérarchie des employés7Fonctionnalités avancées
Surcharge d'opérateursIndexeurs (this[])Redéfinition de ToString()Méthodes d'extensionRécapitulatif - Liste personnalisée10Patrons de conception - Partie 1
Introduction aux patrons de conceptionSingleton Thread-SafePatron FabriquePatron Observateur (Événements)Patron Stratégie2Propriétés et membres statiques
Propriétés auto-implémentéesPropriétés en lecture/écriture seuleChamps et méthodes statiquesClasses statiquesMembres à corps d'expression5Polymorphisme & Interfaces
Polymorphisme : Compilation vs ExécutionInterface vs Classe AbstraiteInterfaces MultiplesInterfaces ExplicitesUpcasting & DowncastingRécapitulatif - Calculateur de Formes8Concepts avancés de la POO
Composition plutôt qu'héritageGénériques (Classes et Méthodes)Délégués et ÉvénementsAttributs et RéflexionIDisposable et l'instruction usingBases de l'Injection de Dépendances11Patrons de conception, Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode TemplatePatron ÉtatPatron Composite3Architecture des classes
Données d'instance vs statiquesMots-clés 'readonly' & 'const'Champs de supportRécapitulatif - Gestionnaire de compte bancaire6Encapsulation
Modificateurs d'accèsPropriétés pour l'encapsulationImplémentation du masquage de donnéesPatterns d'immuabilitéRécapitulatif - Dossiers d'étudiants12Projet : Système de gestion de bibliothèque
Structure du projetModèles Livre et UtilisateurLogique du système d'empruntLINQ pour la rechercheInterface Console / Interface d'administrationTests unitaires (NUnit/xUnit)Entraînez-vous par vous-même : Compilateur C# en ligne