A definição de interfaces na orientação a objetos as definem como “padrões definidos através de contratos que são formados com as classes”. Assim como contratos as interfaces definem cláusulas (assinaturas de métodos) que a pessoa que o assina (as classes que as implementam) deverão seguir.
Desta forma, sempre ficou muito claro que as classes são obrigadas a implementar todos os métodos declarados em uma interface. Devido a este comportamento, quando é necessário adicionar um novo método em uma interface, as opções sempre foram: também alterar todas as classes que a implementa ou criar uma nova interface.
Para mudar este cenário, no C# 8 foi adicionado um novo recurso: implementação padrão.
Implementação padrão
Agora é possível adicionar um corpo para métodos definidos em uma interface. Com isso, caso o método não seja declarado na classe ou estrutura que implementar a interface, não é gerado nenhum erro.
Vamos a um exemplo, suponha a interface abaixo:
public interface IRepositorio<T>
{
List<T> ObterTodos();
}
Que é implementada pela classe:
public class PessoaRepositorio: IRepositorio<Pessoa>
{
public List<Pessoa> ObterTodos()
{
//....
}
}
Suponha que seja necessário alterar a interface, para adicionar um novo método. Agora é possível fazer isso sem quebrar nenhum código:
public interface IRepositorio<T>
{
List<T> ObterTodos();
T PrimeiroRegistro() => ObterTodos().FirstOrDefault();
}
Mesmo que a classe PessoaRepositorio
não implemente este novo método, ela ainda está satisfazendo o contrato. Um objeto dela não terá acesso a ele, mas ele pode ser “convertido” para a interface, que terá acesso ao método:
public static void Primeiro(PessoaRepositorio repositorio)
{
IRepositorio irepositorio = repositorio; // Convertendo para a interface
var pessoa = irepositorio.PrimeiroRegistro(); //Chamando o novo método
}
Claro que se a classe implementar o método, a declaração padrão definida na interface será ignorada. E mesmo novas classes que implementarem a interface não precisarão definir o método.
Conclusão
Não recomendo que isso seja utilizado em novas interfaces para que elas se enquadrem em várias situações. A recomendação de sempre criar uma interface enxuta e objetiva não mudou. Mas este recurso será muito útil na hora da manutenção dos códigos.
Mesmo assim, lembre-se de sempre utilizá-lo com parcimônia. Dependendo da situação, talvez a melhor opção seja criar uma nova interface e não alterar uma existente.