C# Language Les extensions et les interfaces permettent ensemble le code DRY et les fonctionnalités de type mixin


Exemple

Les méthodes d'extension vous permettent de simplifier vos définitions d'interface en n'incluant que les fonctionnalités essentielles de l'interface et en définissant des méthodes de commodité et des surcharges comme méthodes d'extension. Les interfaces avec moins de méthodes sont plus faciles à implémenter dans les nouvelles classes. Garder les surcharges comme des extensions plutôt que de les inclure dans l'interface vous évite de copier du code standard dans chaque implémentation, vous aidant ainsi à conserver votre code SEC. Ceci est en fait similaire au modèle de mixin que C # ne supporte pas.

Les extensions de System.Linq.Enumerable à IEnumerable<T> sont un bon exemple. IEnumerable<T> requiert uniquement la classe d'implémentation pour implémenter deux méthodes: GetEnumerator() générique et non générique. Mais System.Linq.Enumerable fournit d'innombrables utilitaires utiles en tant qu'extensions permettant une consommation claire et concise d' IEnumerable<T> .

Ce qui suit est une interface très simple avec des surcharges de commodité fournies en tant qu'extensions.

public interface ITimeFormatter
{
   string Format(TimeSpan span);
}

public static class TimeFormatter
{
    // Provide an overload to *all* implementers of ITimeFormatter.
    public static string Format(
        this ITimeFormatter formatter,
        int millisecondsSpan)
        => formatter.Format(TimeSpan.FromMilliseconds(millisecondsSpan));
}

// Implementations only need to provide one method. Very easy to
// write additional implementations.
public class SecondsTimeFormatter : ITimeFormatter
{
   public string Format(TimeSpan span)
   {
       return $"{(int)span.TotalSeconds}s";
   }
}

class Program
{
    static void Main(string[] args)
    {
        var formatter = new SecondsTimeFormatter();
        // Callers get two method overloads!
        Console.WriteLine($"4500ms is rougly {formatter.Format(4500)}");
        var span = TimeSpan.FromSeconds(5);
        Console.WriteLine($"{span} is formatted as {formatter.Format(span)}");
    }
}