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.
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:
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.
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
- Curso de dbExpress e DataSnap
- Curso de dbExpress e DataSnap - Parte II
- Curso de dbExpress e DataSnap - Parte III
- Curso de dbExpress e DataSnap - Parte IV
- Curso de dbExpress e DataSnap - Parte V
- Curso de dbExpress e DataSnap - Parte VI
- Curso de dbExpress e DataSnap - Parte VII
- Curso de dbExpress e DataSnap - Parte VIII
- Curso de dbExpress e DataSnap - Parte IX
- Curso de dbExpress e DataSnap - Parte X
- Curso de dbExpress e DataSnap - Parte XI
- Curso de dbExpress e DataSnap - Parte XII
- Curso de dbExpress e DataSnap - Parte XIII
- Curso de dbExpress e DataSnap - Parte XIV
- Curso de dbExpress e DataSnap - Parte XV
- Curso de dbExpress e DataSnap - Parte XVI
- Curso de dbExpress e DataSnap - Parte XVII
- Curso de dbExpress e DataSnap - Parte XVIII
- Curso de dbExpress e DataSnap - Parte XIX
- Curso de dbExpress e DataSnap - Parte XX
- Curso de dbExpress e DataSnap - Parte XXI
- Curso de dbExpress e DataSnap - Parte XXII
- Curso de dbExpress e DataSnap - Parte XXIII
- Curso de dbExpress e DataSnap - Parte XXIV
- Curso de dbExpress e DataSnap - Parte XXV
- Curso de dbExpress e DataSnap - Parte XXVI
- Curso de dbExpress e DataSnap - Parte XXVII
- Curso de dbExpress e DataSnap - Parte XXVIII
- Curso de dbExpress e DataSnap - Parte XXIX
- Curso de dbExpress e DataSnap - Parte XXX