Interface C# com implementação padrão

Resumo : neste tutorial, você aprenderá como definir uma interface C# com uma implementação padrão em C# 8 ou posterior.

Introdução à implementação padrão da interface C#

Suponha que temos uma interface ILogger que possui um método Log()e duas classes ConsoleLoggere FileLoggerque implementa a interface:

interface ILogger
{
    void Log(string message);
}

class ConsoleLogger : ILogger
{
    public void Log(string message)
    {
        Console.WriteLine(message);
    }
}

class FileLogger : ILogger
{
    public string Filename { get; set; }

    public FileLogger(string filename)
    {
        Filename = filename;
    }
    public void Log(string message)
    {
        File.AppendAllText(Filename, message + Environment.NewLine);
    }

}Linguagem de código:  C#  ( cs )

Se você quiser adicionar um novo método à ILoggerinterface, seu programa não funcionará a menos que você implemente esse método em todas as classes existentes que implementam a interface.

Por exemplo:

interface ILogger
{
    void Log(string message);
    void Log(Exception exception);
}Linguagem de código:  C#  ( cs )

Neste exemplo, adicionamos um novo Log()método que possui um parâmetro como instância da Exceptionclasse. No entanto, isso interromperá o programa.

Para resolver isso, o C# 8 ou posterior permite que os membros da interface tenham implementações padrão.

Por exemplo, um método da interface pode ter uma implementação padrão. Se as classes de implementação não fornecerem uma implementação para esse membro, nenhum erro ocorrerá. Em vez disso, a implementação padrão é usada.

O exemplo a seguir adiciona o Log()método que aceita uma instância de exceção. Este Log()método possui uma implementação que mostra a mensagem de exceção ao console:

interface ILogger
{
    void Log(string message);
    void Log(Exception exception) => Console.WriteLine(exception.Message);
}Linguagem de código:  C#  ( cs )

Neste caso, as classes existentes não precisam implementar o novo Log()método. Conseqüentemente, o programa será compilado com sucesso e funcionará corretamente.

O seguinte cria uma nova instância da FileLoggerclasse e chama o Log()método com um argumento de exceção:

// Program.cs
ILogger logger = new FileLogger(@"C:\temp\logs.txt");
logger.Log(new Exception("An exception occurred."));Linguagem de código:  C#  ( cs )

Como FileLoggernão implementa o novo Log()método, o novo Log()método usa a implementação padrão na interface para mostrar a mensagem de exceção ao console.

A FileLoggerclasse a seguir fornece uma implementação para o novo Log()método:

class FileLogger : ILogger
{
    public string Filename { get; set; }

    public FileLogger(string filename)
    {
        Filename = filename;
    }
    public void Log(string message)
    {
        File.AppendAllText(Filename, message + Environment.NewLine);
    }

    public void Log(Exception exception)
    {
        Log(exception.Message);
    }

}Linguagem de código:  C#  ( cs )

Se você executar o programa, verá que ele registra a mensagem de exceção em um arquivo de log:

// Program.cs
ILogger logger = new FileLogger(@"C:\temp\logs.txt");
logger.Log(new Exception("An exception occurred."));Linguagem de código:  C#  ( cs )

Junte tudo.

interface ILogger
{
    void Log(string message);
    void Log(Exception exception) => Console.WriteLine(exception.Message);
}

class ConsoleLogger : ILogger
{
    public void Log(string message)
    {
        Console.WriteLine(message);
    }
}

class FileLogger : ILogger
{
    public string Filename { get; set; }

    public FileLogger(string filename)
    {
        Filename = filename;
    }
    public void Log(string message)
    {
        File.AppendAllText(Filename, message + Environment.NewLine);
    }

    public void Log(Exception exception)
    {
        Log(exception.Message);
    }

}Linguagem de código:  C#  ( cs )

Resumo

  • Fornece implementação padrão para um membro da interface para manter a compatibilidade com versões anteriores do programa.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *