
Índices
Introdução
Nesse post iremos abordar sobre a utilização de Interfaces em Delphi, vantagens de uso, declaração, implementação e código fonte completo.
Entendendo e Utilizando em Seus Projetos
Diferença entre Classes Abstratas e Interfaces
No desenvolvimento de software, as interfaces e classes abstratas são conceitos fundamentais que ajudam a definir contratos e comportamentos esperados das classes. Embora ambas sejam usadas para definir métodos que devem ser implementados por classes derivadas, elas têm diferenças importantes:
- Classes Abstratas: São classes que não podem ser instanciadas diretamente. Elas podem conter métodos abstratos (sem implementação) e métodos concretos (com implementação). Uma classe abstrata pode herdar de outra classe e implementar métodos.
- Interfaces: São contratos puros que definem um conjunto de métodos sem qualquer implementação. Uma classe que implementa uma interface deve fornecer a implementação de todos os métodos definidos na interface. As interfaces não podem conter nenhum código, apenas declarações de métodos.
Como Declarar e Implementar Interfaces em Delphi
Declarando uma Interface
Em Delphi, uma interface é declarada usando a palavra-chave interface
. Aqui está um exemplo de como declarar uma interface:
type ICalculadora = interface ['{D3E9D48C-52FE-4C82-9F1C-3D7F3CDBD8B1}'] function Somar(a, b: Integer): Integer; function Subtrair(a, b: Integer): Integer; function Multiplicar(a, b: Integer): Integer; function Dividir(a, b: Integer): Double; end;
Implementando uma Interface
Para implementar uma interface, uma classe deve declarar que implementa essa interface e fornecer implementações para todos os métodos definidos na interface:
type TCalculadora = class(TInterfacedObject, ICalculadora) public function Somar(a, b: Integer): Integer; function Subtrair(a, b: Integer): Integer; function Multiplicar(a, b: Integer): Integer; function Dividir(a, b: Integer): Double; end; implementation function TCalculadora.Somar(a, b: Integer): Integer; begin Result := a + b; end; function TCalculadora.Subtrair(a, b: Integer): Integer; begin Result := a - b; end; function TCalculadora.Multiplicar(a, b: Integer): Integer; begin Result := a * b; end; function TCalculadora.Dividir(a, b: Integer): Double; begin if b = 0 then raise Exception.Create('Divisão por zero não é permitida'); Result := a / b; end;
Vantagens do Uso de Interfaces
O uso de interfaces em Delphi traz várias vantagens para o desenvolvimento de software, incluindo:
- Desacoplamento: Interfaces permitem que o código seja mais modular e menos dependente das implementações concretas. Isso facilita a manutenção e a evolução do software.
- Flexibilidade: Com interfaces, é possível trocar implementações facilmente sem alterar o código que usa a interface. Isso é útil, por exemplo, ao mudar de um banco de dados para outro ou ao substituir um algoritmo por uma versão mais eficiente.
- Reutilização de Código: Interfaces permitem que diferentes classes implementem o mesmo conjunto de métodos, promovendo a reutilização de código e reduzindo a duplicação.
- Teste e Mocking: Interfaces facilitam a criação de mocks para testes unitários, permitindo que as dependências sejam substituídas por versões simuladas.
Exemplo Prático com Código
Vamos criar um exemplo prático de uma aplicação Delphi que usa interfaces para definir e implementar uma calculadora simples.
Passo 1: Definindo a Interface
Primeiro, vamos definir a interface ICalculadora
conforme mostrado anteriormente.
Passo 2: Implementando a Interface
Em seguida, implementamos a interface na classe TCalculadora
.
Passo 3: Utilizando a Interface
Agora, vamos criar um formulário que utiliza a interface ICalculadora
para realizar operações matemáticas.
- Crie um novo projeto VCL Forms Application no Delphi.
- Adicione um
TEdit
para cada um dos números de entrada (dois no total). - Adicione botões para cada operação matemática (Somar, Subtrair, Multiplicar, Dividir).
- Adicione um
TLabel
para exibir o resultado.
No código do formulário, usaremos a interface ICalculadora
para realizar as operações:
unit Unit1; interface uses Vcl.Forms, Vcl.Controls, Vcl.StdCtrls, System.SysUtils, System.Classes; type //Interface ICalculadora ICalculadora = interface ['{D3E9D48C-52FE-4C82-9F1C-3D7F3CDBD8B1}']//Assinatura da classe, para gerar essa linha basta apertar as teclas Shift + Ctrl + G function Somar(a, b: Integer): Integer; //Declaração do método Somar function Subtrair(a, b: Integer): Integer; //Declaração do método Subtrair function Multiplicar(a, b: Integer): Integer; //Declaração do método Multiplicar function Dividir(a, b: Integer): Double; //Declaração do método Dividir end; //Classe TCalculadora que implementa a interface ICalculadora TCalculadora = class(TInterfacedObject, ICalculadora) public function Somar(a, b: Integer): Integer; //Implementação do método Somar function Subtrair(a, b: Integer): Integer; //Implementação do método Subtrair function Multiplicar(a, b: Integer): Integer; //Implementação do método Multiplicar function Dividir(a, b: Integer): Double; //Implementação do método Dividir end; //Classe do formulário TForm1 = class(TForm) EditNum1: TEdit; EditNum2: TEdit; BtnSomar: TButton; BtnSubtrair: TButton; BtnMultiplicar: TButton; BtnDividir: TButton; LabelResultado: TLabel; procedure BtnSomarClick(Sender: TObject); procedure BtnSubtrairClick(Sender: TObject); procedure BtnMultiplicarClick(Sender: TObject); procedure BtnDividirClick(Sender: TObject); private Calculadora: ICalculadora; public constructor Create(AOwner: TComponent); override; end; var Form1: TForm1; implementation {$R *.dfm} { TCalculadora } function TCalculadora.Somar(a, b: Integer): Integer; begin Result := a + b; end; function TCalculadora.Subtrair(a, b: Integer): Integer; begin Result := a - b; end; function TCalculadora.Multiplicar(a, b: Integer): Integer; begin Result := a * b; end; function TCalculadora.Dividir(a, b: Integer): Double; begin if b = 0 then raise Exception.Create('Divisão por zero não é permitida'); Result := a / b; end; { TForm1 } constructor TForm1.Create(AOwner: TComponent); begin inherited Create(AOwner); Calculadora := TCalculadora.Create; end; procedure TForm1.BtnSomarClick(Sender: TObject); var Num1, Num2: Integer; begin Num1 := StrToInt(EditNum1.Text); Num2 := StrToInt(EditNum2.Text); LabelResultado.Caption := 'Resultado: ' + IntToStr(Calculadora.Somar(Num1, Num2)); end; procedure TForm1.BtnSubtrairClick(Sender: TObject); var Num1, Num2: Integer; begin Num1 := StrToInt(EditNum1.Text); Num2 := StrToInt(EditNum2.Text); LabelResultado.Caption := 'Resultado: ' + IntToStr(Calculadora.Subtrair(Num1, Num2)); end; procedure TForm1.BtnMultiplicarClick(Sender: TObject); var Num1, Num2: Integer; begin Num1 := StrToInt(EditNum1.Text); Num2 := StrToInt(EditNum2.Text); LabelResultado.Caption := 'Resultado: ' + IntToStr(Calculadora.Multiplicar(Num1, Num2)); end; procedure TForm1.BtnDividirClick(Sender: TObject); var Num1, Num2: Integer; begin Num1 := StrToInt(EditNum1.Text); Num2 := StrToInt(EditNum2.Text); LabelResultado.Caption := 'Resultado: ' + FloatToStr(Calculadora.Dividir(Num1, Num2)); end; end.
Veja abaixo como ficou a ilustração do projeto utilizando Interfaces:

Código fonte do exemplo
Você pode fazer o download do exemplo do projeto através do repositório do github:
https://github.com/Gisele-de-Melo/Interface
Conclusão
O uso de interfaces em Delphi é uma prática poderosa que traz muitos benefícios para o desenvolvimento de software. Elas promovem o desacoplamento, a flexibilidade e a reutilização de código, além de facilitar o teste de software. Com este guia, você aprendeu a diferença entre classes abstratas e interfaces, como declarar e implementar interfaces, e as vantagens de usar interfaces em seus projetos. O exemplo prático fornecido demonstrou como aplicar esses conceitos em uma aplicação real. Continue explorando e aplicando interfaces em seus projetos para criar software mais modular e sustentável.