C# 8.0 -  Implementação da interface padrão


Neste artigo vou apresentar o novo recurso introduzido na versão 8.0 da linguagem C# conhecido como implmentação da interface padrão.

Você já deve conhecer os benefícios em usar interfaces em seus projetos. Um dos problemas na utilização de interfaces é quando precisamos fazer alterações em uma interface usada por uma aplicação.

Se o projeto for pequeno, podemos facilmente identificar as classes e fazer as alterações correspondentes conforme a interface muda. Mas, se o projeto for grande e complexo, seria muito difícil identificar todos os módulos e classes do projeto impactados pelas alterações.

Para tentar minimizar esse tipo de problema foi implementado na versão 8.0 da linguagem C# o recurso que vou traduzir por : Implementação da interface padrão.

Antes de prosseguir vamos fazer um resumo dos principais conceitos relacionados às interfaces antes da versão 8.0:

  • Uma interface pode conter apenas declarações de métodos, propriedades, indexadores e eventos;
  • Uma interface não pode incluir membros privados, protegidos ou internos;
  • Uma interface não pode conter campos;
  • Por padrão, todos os membros de uma interface são públicos e abstratos;

Agora vamos supor que temos uma interface IProduto com o código abaixo que é implementada em diversas classes do nosso projeto:

Agora vamos supor que temos que alterar esta interface incluindo o método AvaliaProduto(Produto produto) para realizar a avaliação dos produtos.

Estamos incluindo um novo membro na interface e teremos que alterar o código de todas as classes que implementam esta interface.

Outra solução seria criar outra interface IProdutoAvaliacao que inclui o novo método e que implementa a interface IProduto:

Esta abordagem parece resolver bem o problema mas se houver a necessidade de incluir novos membros na interface voltamos a velho problema.

Como o novo recurso - Implementação da interface padrão - resolve este problema ?

Este recurso permite a você escrever uma implementação de qualquer método na interface.

Isso mesmo !!! Fazer a implementação de um método na interface.

Ele é útil em situações nas quais você pode adicionar novos membros para interagir com uma implementação padrão, sem quebrar a implementação existente.

Assim, para o nosso exemplo podemos fazer a implementação do método AvaliaProduto() na interface:

Observe que na implementação usamos o modificador public mas podemos usar outros modificadores como:  private, static, virtual, protected e também implementar um método abstrato usando abstract.

Vamos supor que a classe Teste implemente a interface IProduto:

Agora não temos mais que criar uma nova interface e alterar a implementação existente. A implementação estará disponível em uma instância da classe que implementou a interface:

Podemos também substituir a implementação padrão, e, neste caso, a nossa implementação será chamada.

Assim, podemos substituir a implementação padrão do método AvaliaProduto() na classe Teste conforme a seguir:

Agora ao usarmos a instância da classe Teste e chamarmos o método AvaliaProduto() :

Teremos como o resultado a  utilização do método que implementamos:



Segundo a Microsoft, as principais motivações para a introdução deste novo recurso foram:

  • Os métodos de interface padrão permitem que um autor de API adicione métodos a uma interface em versões futuras sem quebrar a compatibilidade de origem ou binária com as implementações existentes dessa interface.
     
  • O recurso permite que o C# interopere com APIs direcionadas para Android (Java) e iOs (Swift), que oferecem suporte a recursos semelhantes.

Isto posto, precisamos atualizar nossos conceitos sobre interfaces:

  • Interfaces agora podem conter implementação de métodos;
  • Interfaces podem conter membros private;
  • Interfaces podem conter membros static;
  • Interfaces podem conter membros protected (não acessíveis via classe derivada mas via interface derivada);
  • Podemos definir métodos abstratos nas interfaces;

Lembrando que este recurso é opcional e você não esta obrigado a usá-lo.

E estamos conversados...

"E Jesus lhe disse: Ninguém, que lança mão do arado e olha para trás, é apto para o reino de Deus."
Lucas 9:62

 

Referências:


José Carlos Macoratti