Artigos Delphi Curso de dbExpress e DataSnap - Parte XIX
Parte XIX – Usando interfaces
Em DataSnap e qualquer arquitetura de objetos distribuídos, faz-se uso intensivo de interfaces. É importantíssimo que você saiba e compreenda como é feita a comunicação entre cliente e servidor de aplicação, através do uso desse recurso. Interfaces são usadas amplamente nos bastidores de um arquitetura DataSnap.
Dessa forma, decido incluir um capítulo introdutório neste curso, que mostra como usar interfaces "puras" (não relacionadas ao DataSnap, mas a POO). Entendendo o princípio básico aqui proposto, será base para entendermos abordagens mais complexas quando estudarmos o COM, MTS, COM+ e SOAP.
Uma interface é semelhante a uma classe que possua somente métodos abstratos, ou seja, sem implementação. Uma interface apenas define métodos que depois devem ser implementados por uma classe. Dessa forma, um objeto pode se comunicar com o outro apenas conhecendo a sua interface, que funciona como uma espécie de contrato.
Uma interface é como se fosse um controle remoto. Você consegue interagir com um objeto conhecendo o que ele oferece, tendo a interface que descreve cada função, porém, sem a mínima idéia de como ele implementa essa funcionalidade internamente.
Assim como TObject é a classe base para todas as classes do Delphi, a interface base para todas as interfaces é IInterface. A interface base para todos as interfaces COM é IUnknown. IUnknown na verdade é apenas um alias para IInterface.
Uma Interface não tem código de implementação associado.
Atenção - O uso de Interfaces é um recurso da linguagem Delphi, de forma que você poderá utilizar interfaces mesmo que não esteja programando objetos distribuídos.
Veja a seguir a declaração de IInterface:
function__Release: Integer; stdcall;
Os métodos _AddRef e _Release definem o mecanismo de contagem de referência. Isso significa que você não precisa liberar um objeto que implementa IInterface. QueryInterface faz solicitações dinamicamente à um objeto para obter uma referência para as interfaces que ele suporta.
Para demonstrar o uso de interfaces vamos criar um pequeno exemplo. Inicie uma nova aplicação no Delphi. Salve o formulário como "uFrmMain.pas" e o projeto "Interfaces.dpr". Dê o nome de "FrmMain" ao formulário.
Abra a unit do formulário e declara a seguinte interface na seção type.
Note que não podemos apertar Shift+Ctrl+C e implementar o método Multiplicar. Esse é um método de interface, como um método abstract de uma classe.
Logo abaixo da interface declare a seguinte classe:
TComputador = class (TInterfacedObject,ICalc) significa "TComputador herda de TInterfacedObject e implementa a interface ICalc". Isso não é herança múltipla.
Observe que ambas as classes TComputador e TCalculadora implementam a interface ICalc, e descendem de TInterfacedObject. TInterfacedObject se encarrega de implementar a interface IInterface.
Aperte Shift+Ctrl+C para declarar os cabeçalhos dos métodos.
if (x<>0) and (y<>0) then
for i:=1 to abs(y) do
result:=result+x;
Observe que ambas as classes implementam o método Multiplicar de ICalc, porém de formas diferentes. Usando Edits, um RadioGroup e um Button construa o seguinte formulário: