Curso de dbExpress e DataSnap

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.

image001.gif 

Figura 1.

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:

 

IInterface = interface

  ['{00000000-0000-0000-C000-000000000046}']

  function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;

  function _AddRef: Integer; stdcall;

  function__Release: Integer; stdcall;

end;

 

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.

 

type

  ICalc = interface

    function Multiplicar (const x,y : integer) : integer;   

  end;

 

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)

  function Multiplicar (const x,y : integer) : integer;

end;

 

TCalculadora = class (TInterfacedObject,ICalc)

  function Multiplicar (const x,y : integer) : integer;

end;

 

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.

 

function TComputador.Multiplicar(const x, y: integer): integer;

begin

  result:=x*y;

end;

 

function TCalculadora.Multiplicar(const x, y: integer): integer;

var

  i : integer;

begin

  result:=0;

  if (x<>0) and (y<>0) then

    for i:=1 to abs(y) do

      result:=result+x;

end;

 

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:

image002.png 

Figura 2.

Dê um duplo clique no botão e digite:

 

procedure TFrmMain.Button1Click(Sender: TObject);

var

  Obj : ICalc;

  n1,n2,r : integer;

begin

  if RadioGroup1.ItemIndex=-1 then exit;

  case RadioGroup1.ItemIndex of

    0 : Obj:=TCalculadora.create;

    1 : Obj:=TComputador.create;

  end;

  n1:=StrToInt(Edit1.Text);

  n2:=StrToInt(Edit2.Text);

  r:=Obj.Multiplicar(n1,n2);

  Edit3.Text:=IntToStr(r);

end;

 

Rode e teste a aplicação.

image004.png 

Figura 3.

 

Download

 

dbExpress, DataSnap e ClientDataSet: Técnicas Avançadas

Para mais informações sobre acesso a dados no Delphi e técnicas avançadas, sugiro a leitura do meu livro, “Delphi: Programação para Banco de Dados e Web”, como apoio para o aprendizado das tecnologias. Na obra mostro várias técnicas introdutórios e avançadas de desenvolvimento com ClientDataSet, dbExpress e DataSnap (multicamadas, incluindo SOAP e COM+). Para mais informações, consulte o link http://www.clubedelphi.net/guinther

Leia todos artigos da série