• 20 hours
  • Medium

Free online content available in this course.

course.header.alt.is_certifying

Got it!

Last updated on 3/10/17

Les méthodes d’extension

Log in or subscribe for free to enjoy all this course has to offer!

En général, pour ajouter des fonctionnalités à une classe, nous pourrons soit modifier le code source de la classe, soit créer une classe dérivée de notre classe et ajouter ces fonctionnalités.

Dans ce chapitre nous allons voir qu'il existe un autre moyen pour étendre une classe : ceci est possible grâce aux méthodes d'extension.
Elles sont intéressantes si nous n'avons pas la main sur le code source de la classe ou si la classe n'est pas dérivable.

Partons à la découverte de ces fameuses méthodes…

Qu'est-ce qu'une méthode d'extension

Comme son nom l’indique, une méthode d’extension permet d’étendre une classe en lui rajoutant des méthodes.
Ceci est pratique lorsque nous ne possédons pas le code source d’une classe et qu’il s’avère difficile de la modifier.

D’une manière générale, lorsque l’on souhaite modifier une classe dont on n’a pas le code source, on utilise une classe dérivée. Ceci est impossible avec des objets qui ne sont pas dérivables, comme c’est le cas pour les structures comme int ou double. Mais également comme c’est le cas pour la classe String. En effet, String n’est pas dérivable, rappelez-vous le mot clé sealed.

Créer une méthode d'extension

Si par exemple nous souhaitons créer une méthode permettant de crypter une chaine de caractères dans un format que nous seuls comprenons, il serait judicieux de créer une méthode dans une classe StringCryptee qui dérive de string.
Comme ceci n’est pas possible, la seule chose qui nous reste c’est de créer une méthode statique utilitaire faisant cet encodage :

class Program
{
    static void Main(string[] args)
    {
        string chaineNormale = "Bonjour à tous";
        string chaineCryptee = Encodage.Crypte(chaineNormale);
        Console.WriteLine(chaineCryptee);
        chaineNormale = Encodage.Decrypte(chaineCryptee);
        Console.WriteLine(chaineNormale);
    }

}

public static class Encodage
{
    public static string Crypte(string chaine)
    {
        return Convert.ToBase64String(Encoding.Default.GetBytes(chaine));
    }

    public static string Decrypte(string chaine)
    {
        return Encoding.Default.GetString(Convert.FromBase64String(chaine));
    }
}

Bon, ok, notre encodage secret ne l’est pas tant que ça :D .
Il s’avère que j’utilise ici un encodage en base 64, algorithme archi connu. Mais bon, c’est pour l’exemple.

Utiliser une méthode d'extension

Ces méthodes statiques jouent bien leur rôle. Mais il est possible de faire en sorte que ces deux méthodes deviennent des méthodes d’extensions de la classe string. Il suffit d’utiliser le mot-clé this devant le premier paramètre de la méthode afin de créer une méthode d’extension :

public static class Encodage
{
    public static string Crypte(this string chaine)
    {
        return Convert.ToBase64String(Encoding.Default.GetBytes(chaine));
    }

    public static string Decrypte(this string chaine)
    {
        return Encoding.Default.GetString(Convert.FromBase64String(chaine));
    }
}

Nous pourrons désormais utiliser ces méthodes comme si elles faisaient parties de la classe String :

string chaineNormale = "Bonjour à tous";
string chaineCryptee = chaineNormale.Crypte();
Console.WriteLine(chaineCryptee);
chaineNormale = chaineCryptee.Decrypte();
Console.WriteLine(chaineNormale);

Pas mal non ?
De plus, si nous regardons dans la complétion automatique, nous pourrons voir apparaître nos fameuses méthodes :

Image utilisateur

Plutôt pratique.

Évidemment, en créant une méthode d’extension, nous n’avons bien sûr pas accès aux méthodes privées ou variables membres internes à la classe. La preuve, les méthodes d’extensions sont des méthodes statiques qui travaillent hors de toute instance de classe.

Par contre, il faut faire attention à l’espace de nom où se situent nos méthodes d’extensions. Si le using correspondant n’est pas inclus, nous ne verrons pas les méthodes d’extension.

Remarquez que les méthodes d’extension fonctionnent aussi avec les interfaces. Plus précisément, elles viennent étendre toutes les classes qui implémentent une interface.
Par exemple, avec deux classes implémentant l’interface IVolant :

public interface IVolant
{
    void Voler();
}

public class Oiseau : IVolant
{
    public void Voler()
    {
        Console.WriteLine("Je vole");
    }
}

public class Avion : IVolant
{
    public void Voler()
    {
        Console.WriteLine("Je vole");
    }
}

si je crée une méthode d’extension prenant en paramètres un IVolant, préfixé par this :

public static class Extentions
{
    public static void Atterir(this IVolant volant)
    {
        Console.WriteLine("J'attéris");
    }
}

je pourrais accéder à cette méthode pour les objets Avion et Oiseau :

Avion a = new Avion();
Oiseau b = new Oiseau();
a.Atterir();
b.Atterir();

À noter que le framework .NET se sert de ceci pour proposer un grand nombre de méthodes d’extension sur les objets implémentant IEnumerable, nous les étudierons dans un prochain cours.

En résumé
  • Une méthode d'extension permet d'étendre une classe en lui rajoutant des méthodes.

  • Il n'est pas recommandé d'utiliser des méthodes d'extension lorsqu'on dispose déjà du code source de la classe ou qu'on peut facilement en créer un type dérivé.

  • On utilise le mot-clé this en premier paramètre d'une classe statique pour étendre une classe.

Example of certificate of achievement
Example of certificate of achievement