Interfaces

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”.

Interface

Tipo definido pelo usuário. Uma interface é uma espécie de classe, mas contém apenas os “protótipos” dos métodos, sem a sua implementação. Corresponde no C++ a uma classe abstrata com todos os métodos “virtuais puros”. Uma classe, além de ser derivada de outra, pode implementar várias interfaces.

Abaixo pode-se ver um exemplo de declaração de interface e sua aplicação em uma classe:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
interface IMinhaInterface
{
    void MeuMetodo();
}
 
class MinhaClasse : IMinhaInterface
{
    // Implementação explícita do membro da interface herdada: 
    void IMinhaInterface.Metodo()
    {
        // Corpo do método.
    }
 
    static void Main()
    {
        // Declara uma instância da classe baseada na interface.
        IMinhaInterface obj = new MinhaClasse();
 
        // Invoca o método.
        obj.MeuMetodo();
    }
}

Veja maiores detalhes no capítulo sobre Orientação a Objetos.