Desenvolvimento - C#

Entendendo interfaces com C#

Neste artigo apresento de forma simplificada e didática o que são interfaces e como podemos utilizá-las no desenvolvimento de aplicativos visando obter um código reutilizável e extensível.

por Fabrício Lopes Sanchez



Uma das dúvidas que mais assolam os desenvolvedores que estão migrando para ambientes Orientados a Objetos é, com certeza, o trabalho correto e efetivo com Interfaces. Esta dúvida é frequentemente encontrada por uma razão em especial: o trabalho com interfaces requer um alto nível de abstração. Por inércia, desenvolvedores que não conseguem entender corretamente o funcionamento dessas estruturas acabam privando-se de sua utilização e, por consequência, desprezando um dos mais poderosos recursos da orientação a objetos.

Este artigo tem como objetivo principal tentar ajudar desenvolvedores que possuem dificuldades para trabalhar com Interfaces, Classes e Métodos Abastratos no C#.

Entendendo Interfaces

O mecanismo de herança entre classes disponibilizado pelo C# e por outras linguagens de programação é um dos recursos mais poderosos da O.O., entrentanto, não é mais poderoso que a herança de interfaces.

Interface é uma estrutura que permite ao desenvolvedor especificar todos os métodos e propriedades que ele deseja que as classes que a implementam disponibilizem.

Utilizando uma interface, é possível separar completamente a definição/assinatura de métodos de suas respectivas implementações, ou seja, de um lado (interface) temos a definição dos mesmos e do outro (classe que implementa a interface), temos a implementação dos mesmos.

Podemos entender uma interface como sendo uma espécie de contrato, ou seja, se uma classe X implementa uma interface Y, logo, Y garante que X disponibilizará todos os métodos definidos em Y. Caso este “contrato” seja quebrado, um erro será gerado.

Interfaces são muito importantes pois, nos permitem separar o “o que” do “como”. A interface não se preocupa com a forma com a qual o método está sendo implementado e sim, que este método estará disponível a todos os objetos que a implementarem. A interface descreve a maneira como você deseja que o objeto seja utilizado ao invés da forma como ele foi implementado.

Outra importante justificativa para a utilização de interfaces em seus projetos .NET, é que, assim como o Java, o C# não trabalha com herança múltipla entre classes de forma nativa. Implementar este recurso somente é possível através da utilização de interfaces. Em um artigo futuro, abordaremos esse tema.

Sintaxe da Interface no C#

O trabalho com interfaces no C# é simples e segue a estrutura apresentada na Listagem 1:

interface ILogger

{

     bool gravaLogAutenticacao(string sql);

}

Listagem 1: Sintaxe para o trabalho com Interfaces no C#

Algumas observações sobre esta estrtutura são pertinentes. Ao definir-se um método dentro de uma interface, não devem ser utilizados os modificadores (public, private, ou protected) e, além disso, o corpo do método é substituído por ; (ponto e vírgula). A lista abaixo apresenta algumas restrições quanto a utilização das interfaces no C#. Há uma recomendação na documentação da .NET Framework para que, ao se nomear uma nova interface a primeira letra do nome seja um I (i maiúsculo). Na Listagem 1, esta recomendação foi seguida ao nomear-se a interface como ILogger.

  1. O desenvolvedor não tem permissão para definir campos em uma interface, nem mesmo campos estáticos, pois, um campo é um detalhe intrínseco de implementação de uma classe ou estrutura.
  2. O desenvolvedor não possui permissão para definir construtores e destrutores pelo mesmo motivo apresentado no ítem 1.
  3. Modificadores de acesso não podem ser implementados para métodos de interfaces, pois, implicitamente todos os elementos em uma interface são públicos.
  4. Não é possível trabalhar com estruturas aninhadas: enumeradores, estruturas, etc.
  5. Interfaces podem herdar apenas outras interfaces.

Implementando Interfaces

Para implementar uma interface, você deve criar uma classe ou estrutura de modo que esta herde a interface criada e implemente todos os métodos nela definidos (lembre-se, o contrato não deve ser quebrado). Assim, levando-se em consideração o exemplo da interface ILogger apresentado na Listagem 1, segue um exemplo de uma classe que implementa esta interface na Listagem 2:

public class AutenticacaoUsuarios : ILogger

{

     bool ILogger.gravaLogAutenticacao(string sentencaGravacao)

          {

                //Efetua rotina de gravação

          }

}

Listagem 2: Classe que implementa a interface ILogger

Ao implementar-mos uma interface, temos que tomar os seguintes cuidados:

  1. O nome do método e o tipo de retorno devem corresponder extamente.
  2. Quaisquer parâmetros, incluindo modificadores de palavras chave ref e out, tem que equivaler exatamente.
  3. É uma boa prática se declarar explicitamente o método com o nome da interface.
  4. Todos os métodos que implementam a interface devem ser publicamente acessíveis.

Bom pessoal, espero que este artigo possa o ajudar a começar a considerar a utilização de interfaces em seus projetos. Com o tempo, você perceberá que seu código estará extremamente estruturado e extensível, aumentando o desacoplamento e baixando o tempo de manutenção de código.

Fabrício Lopes Sanchez

Fabrício Lopes Sanchez - Possui graduação em Ciência da Computação pela UNORP - Centro Universitário do Norte Paulista (2005). Obteve título de mestre junto a USP (Universidade de São Paulo) no Programa Interunidades Bioengenharia campus São Carlos. Atualmente é aluno de doutorado e pesquisador na mesma instituição e departamento. É membro regular do SpeechLab (Laboratório de Processamento de Áudio e Voz) localizado no Instituto de Física de São Carlos. Atua na área de processamento digital de áudio e voz, especialmente baseado em wavelets aplicadas à inserção e extração de watermarks em sinais de áudio e fala, análise cepstral de sinais de fala e desenvolvimento de ferramentas computacionais aplicadas ao processamento digital de sinais. Atua como desenvolvedor web na União Central Brasileira da IASD com C# e ASP.NET desde 2007. É fundador e administrador da comunidade .NET Interior.