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 ConsoleLogger
e FileLogger
que 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 à ILogger
interface, 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 Exception
classe. 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 FileLogger
classe 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 FileLogger
nã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 FileLogger
classe 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.