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:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
C# - StreamReader, StringReader e TextReader . Qual a ... - Macoratti
C# - Imprimindo um arquivo texto - Macoratti
C# - Usando OpenFileDialog - Macoratti
C# - Formatando arquivos textos - Macoratti
C# - Convertendo valores para o formato monetário
C# - Lendo e escrevendo em arquivos textos e binários - Macoratti
VB.NET - Conversão entre tipos de variáveis - Macoratti
C# - Localizando Arquivos - Macoratti