Avec les versions précédentes, l’implémentation des interfaces ne pouvait évoluer qu’avec une extended méthode. Sans cette extension toute nouvelle signature imposait une modification de toutes les classes implémenteuses.

C# 8.0 apporte la possibilité d’ajouter une méthode complète dans l’interface sans être obligé de modifier les classes qui implémentent cette interface. Ceci ressemble à une classe abstraite, sans l’être car la différence entre multi héritage des interfaces et des classes ne change pas, ce qui laisse une certaine souplesse dans le traitement.

Exemple pris de MS :


interface ILogger
{
    void Log(LogLevel level, string message);
    void Log(Exception ex) => Log(LogLevel.Error, ex.ToString()); // New overload
}

class ConsoleLogger : ILogger
{
    public void Log(LogLevel level, string message) { ... }
    // Log(Exception) gets default implementation
}

Dans notre exemple la classe ConsoleLogger n’avait pas à implémenter la méthode Log(Exception) de ILogger, car elle est déclarée en tant que default implementation. Avec C# 8.0 on peut ajouter des membres comme des defaults implementation à une interface existante.

        Ceci ne résout pas le “diamond” problem, i.e. l’ambiguïté générée par deux interfaces qui ont une même signature et qu’une classe les implémente toutes les deux. Mais il permettra de faire évoluer une interface sans toucher à toutes les classes qui en dépendent.