O .NET Framework disponibiliza uma espécie de classe que nos permite implementar classes completamente abstratas, ou seja, sem nenhuma implementação com algumas vantagens e desvantagens. São chamadas de “Interfaces”. As regras para criação de uma interface em relação às classes abstratas são:
- tem o identificados “interface” e não “class”;
- não precisam do modificador “abstract”, nem nos métodos;
- não podem conter campos, só métodos;
- não podem conter modificadores de acesso (public, private);
- só podem ser herdadas;
Se não tivéssemos a implementação do método “ImprimeValores” na classe anterior, através de Intefaces poderíamos defini-la do seguinte modo:
1 2 3 4 5 6 7 8 | ... interface IMinhaInterface { void RecebeValores(int v1, int v2); void CalculaValores(); void ImprimeValores(); } ... |
Por convenção, nomeia-se uma interface com um “I” maiúsculo no início do nome para facilitar sua identificação em meio a classes.
A principal vantagem das interfaces sobre as classes abstratas é o fato do mecanismo de herança funcionar com herança múltipla. Como dito anteriormente, o .NET não permite herança múltipla de classes dado os problemas gerados por esse processo. Como as interfaces não geram implementações, pode-se herdar mais de uma interface em uma classe. O código abaixo demonstra um exemplo de herança múltipla com interfaces e classes:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | ... interface IMinhaInterface { void CalculaValores(); void ImprimeValores(); } abstract class MinhaClasseAbstrata { public abstract void RecebeValores(int v1, int v2); } // declara a classe e herda a classe abstrata e a interface class HerdaMultiplas: MinhaClasseAbstrata, IMinhaInterface { public void CalculaValores() { // .. } public void ImprimeValores() { // ... } public override void RecebeValores(int v1, int v2) { // ... } } ... |
Podemos herdar duas ou mais interfaces. O .NET Framework implementa uma série de interfaces que implementam métodos padrão de diversos objetos. As mais conhecidas são IComparable (implementa o método CompareTo) e IDisposable (implementa o método Dispose). Basta herdá-las, pois fazem parte do namespace “System”.