Interfaces em Delphi

Interfaces em Delphi
Interface Delphi.

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.

  1. Crie um novo projeto VCL Forms Application no Delphi.
  2. Adicione um TEdit para cada um dos números de entrada (dois no total).
  3. Adicione botões para cada operação matemática (Somar, Subtrair, Multiplicar, Dividir).
  4. 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:

Ilustração do projeto.

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.

Posts Relacionados


Deixe um comentário