C#  8.0  -  Default Interface Members


Hoje vou apresentar com mais detalhes o novo recurso Default Interface Members da versão 8.0 da linguagem C#.

Temos muitas novidades na versão 8.0 da linguagem C# e eu já apresentei um resumo das principais neste artigo: C# 8.0 - As novidades da nova versão

O novo recurso Default Interface Members permite adicionar membros às interfaces e fornecer uma implementação para esses membros.

Com esse recurso agora podemos adicionar métodos a uma interface em versões posteriores sem interromper a compatibilidade de origem ou binária com as implementações existentes dessa interface. As implementações existentes herdam a implementação padrão.

Esse recurso também permite que o C# faça a interação com APIs direcionadas ao Android ou Swift, que oferecem suporte a recursos semelhantes.

Para poder usar os novos recursos basta instalar a última versão do Visual Studio Community 2019 e criar um projeto do tipo Console Application para .NET Core:

Vamos supor que temos a seguinte definição para uma interface IDesenvolvedor:

Esta interface esta sendo implementada pela classe DesenvolvedorMobile :

Agora vamos supor que você precisa estender a interface IDesenvolvedor adicionando um novo método AprenderNovaLinguagem(string linguagem) :

Ao incluir o novo método na interface, a classe DesenvolvedorMobile que implementa a interface vai exigir que você implemente o novo método acusando o erro conforme abaixo:

Agora imagine se essa sua interface for utilizada em muitos lugares por outras equipes de desenvolvedores. Sentiu o problema ?

Assim, dependendo de qual extensivamente sua interface for usada mais trabalhoso será realizar essa alteração.

Graças ao novo recurso Default Interface Members esse problema agora é passado...

Implementando Default Interface Members

Vamos usá-lo para resolver o nosso problema implementando o novo membro na interface usando o C# 8.0 :

Aqui definimos o novo método e fizemos a sua implementação na interface.

Percebeu que agora a classe DesenvovledorMobile não apresenta mais o erro pois não tem a obrigação de implementar o novo método que foi implementado por padrão na interface.

Agora podemos usar a classe da seguinte forma:

Note que estamos definindo um instância de DesenvolvedorMobile contextualmente como um IDesenvolvedor e por isso podemos acessar o método implementado.

Executando o projeto iremos obter:

Agora se eu tentar utilizar o método implementado na interface como um DesenvolvedorMobile vou obter um erro:

Tudo bem, tudo certo, mas...

Considere que ao usar esse recurso a assinatura da interface esta sendo alterada e com isso todas as classes que implementam a interface passam a ter novas funcionalidades injetadas.

E mais, agora passamos a ter um problema que a linguagem C# não tinha...

Como alguns de vocês já perceberam, esse novo recurso expõe o C# ao problema da herança múltipla (também conhecido como 'Diamante da Morte').

Até agora, o C# não tinha esse problema, porque só podíamos herdar de uma única classe. Podiamos implementar várias interfaces, mas até agora as interfaces não podiam fornecer a implementação de métodos. Por causa disso, não havia o tal problema do 'Diamante da Morte'.

Mas esse é um assunto que vou abordar em outro artigo.

Concluindo, agora com o novo recurso podemos:

Aguarde mais artigos sobre as novidades do C# 8.0.

"Abraão, vosso pai, exultou por ver o meu dia, e viu-o, e alegrou-se.
Disseram-lhe, pois, os judeus: Ainda não tens cinqüenta anos, e viste Abraão?
Disse-lhes Jesus: Em verdade, em verdade vos digo que antes que Abraão existisse, eu sou."

João 8:56-58

Referências:


José Carlos Macoratti