Interface em C#
Fala galerinha, blz? Hoje vamos dar continuidade ao assunto de C# e neste artigo entenderemos o que são as interfaces. Não confundam Interface UI com o conceito de Interface OO, são duas coisas bem diferentes.
De acordo com a documentação do C#, uma Interface contém definições para um grupo de funcionalidades relacionadas que uma classe não abstrata ou uma estrutura deve implementar.
Em resumo, uma Interface funciona como um contrato entre ela e qualquer classe ou estrutura que a implementa. Ou seja, a classe que implementa uma interface é obrigada a implementar todos os seus membros, sejam eles métodos, propriedades, eventos ou indexadores.
Uma Interface tem apenas a declaração de membro ou assinatura e, implicitamente, todos os membros de uma interface são públicos e abstratos.
Você define uma interface usando a palavra-chave “Interface” como o exemplo a seguir mostra no Código 1.
Obs: O nome de uma interface deve ser um nome identificador C# válido. Por convenção, os nomes de interface começam com uma letra maiúscula
I
.
Na linguagem C# a sintaxe usada para indicar a utilização de uma interface é colocar dois pontos após o nome da classe concreta que vai implementar a interface seguido do nome da interface, como é mostrado no Código 2.
Neste exemplo, note que a classe ClassConcreta
esta herdando a interface IExemploInterface
e deve implementar um método chamado ExemploMetodo()
que não tem parâmetros e retorna void
. Chamamos isso de herança de interface e , como vemos, temos a implementação do método ExemploMetodo()
na classe ClassConcreta
.
Para concluir, no método Main()
é criado uma referência da classe que implementa a Interface e posteriormente o método ExemploMetodo()
é chamado.
Para um exemplo mais completo acessem a documentação do C# e vejam este exemplo, neste link.
Vimos assim, de uma forma simples, como criar e usar interfaces na linguagem C#.
Vejamos a seguir algumas características importantes das interfaces:
- Uma interface não fornece herança como uma classe ou classe abstrata, ela só declara membros que uma classe de implementação precisa implementar.
- Uma interface não pode ser instanciada mas pode ser referenciada pelo objeto da classe que a implementa. Além disso, a referência da interface funciona como objeto de referência e se comporta como o objeto.
No exemplo acima vemos esse comportamento no código:
IAcesso oAcesso = new Documento();
IComprimir oComprimir = new Documento(); - A interface contém somente propriedades, indexadores, métodos, delegates e assinaturas de eventos.
- Uma interface não pode conter constantes, construtores, variáveis de instância, destrutores, membros estáticos ou interfaces aninhadas.
- Os membros de uma interface não pode ter qualquer modificador de acesso mesmo público.
- Implicitamente, cada membro de uma interface é público e abstrato. Além disso, você não tem permissão para especificar os membros de uma interface pública e abstratas ou virtuais.
- Uma interface pode ser herdada a partir de uma ou mais interfaces.
- Uma interface pode estender outra interface.
- Uma classe ou estrutura pode implementar mais de uma interface.
- Uma classe que implementa uma interface pode marcar qualquer método da interface como virtual e este método pode ser sobrescrito pelas classes derivadas.
Quais os benefícios em usar uma interface ?
Muitas vezes, devido aos prazos cada vez mais curtos, a grande demanda e correria do dia a dia procuramos pelo caminho mais fácil, que aparentemente nos dá menos trabalho no momento, e com isso deixamos de lado as boas práticas criando sistemas ‘quebra-galhos’ que são feitos para funcionar por um curto período (pois mais a frente a gente vai consertar não é mesmo ???) mas acabam se perpetuando e se transformando em um ajuntamento de código sem padrão algum.
Usar interface é uma forma de criar e definir um contrato que ajuda na organização do código.
Um dos pilares da programação orientada a objetos diz: “Programe para uma interface e não para uma implementação.” (Erich Gamma)
Mas afinal o que há de tão vantajoso assim em usar interfaces ?
- Permitem criar sistemas fracamente acoplados e mais flexível a mudanças (ou resiliente a mudanças). Isto é possível pois ao utilizar interfaces, se houver necessidade, podemos simplesmente mudar a implementação para adaptar a aplicação as mudanças;
- Os papeis dos desenvolvedores podem ser bem definidos e segregados. Ao usar interfaces o desenvolvedor não tem que se preocupar como ela será implementada, somente tem que conhecer como invocar as funcionalidades definidas. Já os desenvolvedor da interface visual podem começar a definir a interface com o usuário sem ter a implementação concreta da interface permitindo o desenvolvimento paralelo;
- Programar para interface deixa o código mais flexível, permitindo trocar a implementação de um componente em tempo de execução, pois quando o código depende de uma interface, pode-se decidir em tempo de execução qual a implementação será utilizada;
- Enquanto as definições da interface não forem alteradas, incluir novos recursos ou re-implementar recursos já existentes decorrentes de mudanças nas regras de negócio não irá ‘quebrar’ o sistema já existente, tornado sua vida útil maior;
- O código gerado é mais limpo e fácil de manter e entender pois existem uma separação de responsabilidades entre os componentes do sistema como a interface do usuário e as regras de negócio e a camada de acesso aos dados;
- A realização de testes unitários fica mais fácil e o código ganha mais qualidade;
Sei que pode não ter ficado claro as vantagens de se usar Interfaces, mas ao longo da disciplina vocês verão que o uso desse recurso vai se valer a pena.
Referências
http://www.macoratti.net/14/04/c_intf1.htm
http://www.macoratti.net/11/11/c_intf1.htm
https://docs.microsoft.com/pt-br/dotnet/csharp/programming-guide/interfaces/