Menu
CoddyTech

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=1

Le 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.

challenge icon

Défi

Facile

Construisons 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érique Storage<T> dans l’espace de noms DataStorage. Ton conteneur de stockage doit :
    • comporter un tableau privé de type T pour stocker les éléments et une propriété Count qui 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 ", "
  • Program.cs : dans ton fichier principal, montre ta classe générique en action avec deux types différents. Crée un Storage<int> et un Storage<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: Hello

Remarque 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)}
    }
}
quiz iconTestez-vous

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

Entraînez-vous par vous-même : Compilateur C# en ligne