Esse artigo faz parte da revista Clube Delphi Edição 74. Clique aqui para ler todos os artigos desta edição

Atenção: por essa edição ser muito antiga não há arquivo PDF para download.Os artigos dessa edição estão disponíveis somente através do formato HTML.

Interfaces

 

Domine um dos mais poderosos recursos da POO

Muitas já ouviram falar, outros sabem que existe, mas nunca utilizaram. O fato é que poucos desenvolvedores fazem uso efetivo de interfaces em seus projetos. Esse recurso, que foi' introduzido no Delphi 3, para dar suporte à arquitetura COM, pode melhorar substancialmente o design de uma aplicação orientada a objetos. Além disso, apesar de não parecer, é muito simples e fácil de ser implementado.

 

Mas o que são Interfaces?

Pense na primeira imagem que vem à sua mente quando falamos "interface'Xertarnente, existe uma grande possibilidade de você ter pensado em uma janela/formulário para a interação com os usuários de seu sistema. Contudo, podemos ir mais a fundo e também imaginar os objetos de nossa aplicação interagindo uns com os outros. Esses, por sua vez, precisam se conhecer para então saber quais mensagens poderão trocar. É aí que entram esinteriaces. Podemos visualizar os objetos de nossa aplicação como instâncias de uma classe na memória e dividi-Ias em duas partes: sua visualização externa e a própria implementação de seus métodos.

Note que até o momento estamos focando nossas atenções apenas nesse contexto. Entretanto, interfaces podem ser encontradas em diversas outras situações. Além das já citadas interações com usuário e entre objetos, programas inteiros também podem se comunicar e peças de hardware precisam se encaixar perfeitamente. Com isso, fica fácil imaginar diversas situações para o uso de interfaces.

Vamos então conceitualizá-las como um contrato entre duas partes. Se determinado objeto declara que implementa uma interface, ele deve segui-la à risca, implementando tudo o que for estipulado por esse 'acordo'. Da mesma maneira,os outros objetos poderão ter certeza de que as mensagens enviadas a ele serão correspondidas. E o mais importante: saberão quais operações poderão ser solicitadas.

Tente fazer uma relação desses objetos com um programa e sua interface gráfica. A intenção do desenho de um formulário é a de mostrar quais operações. podem ser executadas sobre tal aplicação. Expondo-as de maneira clara para quem estiver utilizando o sistema.

 

E quais as vantagens do uso desse conceito em meus objetos?

O Delphi, por natureza, é uma linguagem fortemente tipada. lsso significa que, quando um método é chamado, já sabemos previamente quais os seus parâmetros e seu tipo de retorno. No caso de objetos, a declaração desses métodos é feita na sua classe, em uma seção denominada, coincidentemente, de interface.

Se declararmos uma variável em nosso código cujo tipo é uma classe, estaremos certos de que poderemos chamar qualquer método disponibilizado pelo objeto que a ela for associado, como por exemplo:

 

UmNadador: TNadador;
( ... )

UmNadador := TNadador.Create;
UmNadador.Nada;

 

Como podemos ver no código anterior, a variável Um Nadador recebe uma instância da classe TNadador e chama seu procedimento Nada. No entanto, o que poderia ser feito se precisássemos associar à Um Nadador, um objeto de uma classe TTriatleta? Bom, se você fosse um programador C++ responderia rápido: fácil, projete TTriatleta para herdar de três classes: TCorredor, TCiclista e TNadador. Tudo bem, uma solução adequada para esse caso.

Como Um Nadador só aceita objetos que implementem TNadador, TTriatleta seria aceito sem problemas, pois herda de TNadador ou, em outras palavras, todo triatleta também é um ciclista. Entretanto, não possuímos o conceito de Herança Múltipla na Delphi Language. Uma classe pode herdar somente de uma outra. Mas então como resolveríamos esse caso? Veremos mais a frente como utilizar as interfaces para suprir essa necessidade.

 

Ok, chega de teoria! Que tal partirmos logo para o código?

Uma interface é constituída apenas por declarações de métodos. Sua diferença em relação a uma classe comum é que nela não haverá nenhuma implementação.

 

INadador = interface

   procedure SetTouca(Touca: TTouca):
...

Quer ler esse conteúdo completo? Tenha acesso completo