Composição e Agregação em Delphi

Composição e Agregação em Delphi
Quebra-Cabeça – Composição e Agregação em Delphi.

Introdução

Na programação orientada a objetos, composição e agregação são dois conceitos fundamentais que descrevem como objetos podem ser relacionados uns aos outros. Entender a diferença entre esses dois conceitos e saber como implementá-los em Delphi é essencial para criar sistemas bem estruturados e manteníveis. Neste artigo, vamos explorar o que são composição e agregação, suas diferenças, e como implementá-las em Delphi com um exemplo prático.

Diferença entre Composição e Agregação em Delphi

Composição

A composição é uma forma de relação “tem-um” onde um objeto é parte integrante de outro objeto. Em outras palavras, quando o objeto “pai” é destruído, os objetos “filhos” também são destruídos. A composição implica uma relação de forte dependência.

Agregação

A agregação também é uma forma de relação “tem-um”, mas ao contrário da composição, os objetos agregados podem existir independentemente do objeto “pai”. Isso significa que a destruição do objeto “pai” não afeta a existência dos objetos agregados. A agregação implica uma relação de dependência mais fraca.

Como Implementar Composição e Agregação em Delphi

Implementando Composição

Para implementar a composição em Delphi, criamos uma classe “pai” que possui uma ou mais instâncias de outras classes “filhas” como parte de seus campos. Essas instâncias são criadas e destruídas pelo objeto “pai”.

type
  TBattery = class
  private
    FCharge: Integer;
  public
    constructor Create;
    procedure ChargeBattery;
    property Charge: Integer read FCharge write FCharge;
  end;

  TSmartphone = class
  private
    FBattery: TBattery;
  public
    constructor Create;
    destructor Destroy; override;
    procedure UsePhone;
    property Battery: TBattery read FBattery;
  end;

constructor TBattery.Create;
begin
  FCharge := 100; // Bateria começa com carga total
end;

procedure TBattery.ChargeBattery;
begin
  FCharge := 100;
end;

constructor TSmartphone.Create;
begin
  FBattery := TBattery.Create; // Composição: bateria é parte integral do smartphone
end;

destructor TSmartphone.Destroy;
begin
  FBattery.Free; // Libera a memória ocupada pela bateria
  inherited;
end;

procedure TSmartphone.UsePhone;
begin
  FBattery.Charge := FBattery.Charge - 10; // Usando o telefone, a bateria descarrega
end;

Implementando Agregação

Para implementar a agregação em Delphi, criamos uma classe “pai” que contém uma referência a uma ou mais instâncias de outras classes “filhas”. Essas instâncias são passadas ao objeto “pai” de fora e não são criadas nem destruídas por ele.

type
  TScreen = class
  private
    FResolution: string;
  public
    constructor Create(AResolution: string);
    property Resolution: string read FResolution write FResolution;
  end;

  TLaptop = class
  private
    FScreen: TScreen;
  public
    constructor Create(AScreen: TScreen);
    procedure ShowResolution;
    property Screen: TScreen read FScreen write FScreen;
  end;

constructor TScreen.Create(AResolution: string);
begin
  FResolution := AResolution;
end;

constructor TLaptop.Create(AScreen: TScreen);
begin
  FScreen := AScreen; // Agregação: a tela é passada para o laptop de fora
end;

procedure TLaptop.ShowResolution;
begin
  WriteLn('Resolution: ', FScreen.Resolution);
end;

Exemplo Prático com Código

Vamos agora criar um exemplo prático que utiliza tanto composição quanto agregação para ilustrar esses conceitos.

Configurando o Ambiente

  1. Abrindo o Delphi: Abra o Delphi e crie um novo projeto VCL Forms Application
  2. Configurando o Formulário Principal: Adicione os seguintes componente ao formulário:
    • TButton(Button1) – Caption Composição
    • TButton(Button2) – Caption Agregação

Exemplo de Composição

Neste exemplo, um carro tem um motor. O motor é criado e destruído junto com o carro, exemplificando a composição.

type
  TEngine = class
  private
    FPower: Integer;
  public
    constructor Create(APower: Integer);
    property Power: Integer read FPower write FPower;
  end;

  TCar = class
  private
    FEngine: TEngine;
  public
    constructor Create(APower: Integer);
    destructor Destroy; override;
    procedure Drive;
    property Engine: TEngine read FEngine;
  end;

constructor TEngine.Create(APower: Integer);
begin
  FPower := APower;
end;

constructor TCar.Create(APower: Integer);
begin
  FEngine := TEngine.Create(APower); // Composição: motor é parte integral do carro
end;

destructor TCar.Destroy;
begin
  FEngine.Free; // Libera a memória ocupada pelo motor
  inherited;
end;

procedure TCar.Drive;
begin
  ShowMessage('Driving with '+ IntToStr(FEngine.Power)+ ' horsepower');
end;

Utilizando a Classe TCar

Para utilizar a classe TCar, precisamos criar uma instância dela, passar a potência do motor como parâmetro e chamar o método Drive para simular a condução do carro.

procedure TForm1.Button1Click(Sender: TObject);
var
  Car: TCar;

begin
    Car := TCar.Create(150); // Cria um carro com um motor de 150 cavalos de potência
    try
      Car.Drive; // Simula a condução do carro
    finally
      Car.Free; // Libera a memória ocupada pelo carro
    end;
end;

Exemplo de Agregação

Neste exemplo, uma equipe de desenvolvimento possui vários programadores. Os programadores são criados independentemente e podem ser adicionados ou removidos da equipe, exemplificando a agregação.

type
  TProgrammer = class
  private
    FName: string;
  public
    constructor Create(AName: string);
    property Name: string read FName write FName;
  end;

  TDevelopmentTeam = class
  private
    FProgrammers: TList<TProgrammer>;
  public
    constructor Create;
    destructor Destroy; override;
    procedure AddProgrammer(AProgrammer: TProgrammer);
    procedure ShowTeam;
  end;

constructor TProgrammer.Create(AName: string);
begin
  FName := AName;
end;

constructor TDevelopmentTeam.Create;
begin
  FProgrammers := TList<TProgrammer>.Create; // Cria a lista de programadores
end;

destructor TDevelopmentTeam.Destroy;
begin
  FProgrammers.Free; // Libera a memória ocupada pela lista de programadores
  inherited;
end;

procedure TDevelopmentTeam.AddProgrammer(AProgrammer: TProgrammer);
begin
  FProgrammers.Add(AProgrammer); // Adiciona um programador à equipe
end;

procedure TDevelopmentTeam.ShowTeam;
var
  Programmer: TProgrammer;
begin
  for Programmer in FProgrammers do
    ShowMessage('Programmer: '+ Programmer.Name);
end;

Utilizando a Classe TDevelopmentTeam

Para utilizar a classe TDevelopmentTeam, precisamos criar instâncias de TProgrammer, adicioná-las à equipe de desenvolvimento e, em seguida, exibir os membros da equipe.

procedure TForm1.Button2Click(Sender: TObject);
var
  Team: TDevelopmentTeam;
  Programmer1, Programmer2: TProgrammer;

begin
  try
    Team := TDevelopmentTeam.Create; // Cria uma nova equipe de desenvolvimento
    try
      Programmer1 := TProgrammer.Create('Alice');
      Programmer2 := TProgrammer.Create('Bob');

      Team.AddProgrammer(Programmer1); // Adiciona Alice à equipe
      Team.AddProgrammer(Programmer2); // Adiciona Bob à equipe

      Team.ShowTeam; // Exibe os membros da equipe
    finally
      Team.Free; // Libera a memória ocupada pela equipe
      Programmer1.Free;//Libera a memória ocupada pelo programador 1
      Programmer2.Free;//Libera a memória ocupada pelo programador 2
    end;
  except
    on E: Exception do
      ShowMessage(E.ClassName+ ': '+ E.Message);
  end;

end;

O exemplo acima foi criado em uma única unit para ficar mais simples e didático, mas você pode melhorar esse projeto criando as classes de composição e agregação em units separadas para melhor organização e reaproveitamento do código.

Caso não saiba como criar e utilizar units veja o post a seguir: https://codedelphi.com/units-em-delphi/

Veja abaixo como ficou a ilustração do projeto utilizando Composição e Agregação:

Composição e Agregação em Delphi
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/ComposicaoAgregacao

Conclusão

Neste artigo, exploramos os conceitos de composição e agregação em Delphi, destacando suas diferenças e como implementá-los. Vimos exemplos práticos de como criar e usar as classes TCar e TDevelopmentTeam, ilustrando como essas relações podem ser aplicadas em um projeto real.

Composição e agregação são ferramentas poderosas na programação orientada a objetos, permitindo uma estrutura clara e flexível para os sistemas que desenvolvemos. Compreender e aplicar corretamente esses conceitos ajudará você a criar códigos mais organizados e fáceis de manter, o que é essencial para o desenvolvimento de software de qualidade.

Posts Relacionados


Livros + e-books

Delphi para Android e iOS

codedelphi.com
codedelphi.com

Delphi Start

codedelphi.com

Programando em Delphi XE

Aprenda programar Delphi

Banco de Dados RAD Delphi

Delphi Programming Projects

Deixe um comentário