
Índice
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
- Abrindo o Delphi: Abra o Delphi e crie um novo projeto VCL Forms Application
- 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:

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
Delphi para Android e iOS
Delphi Start
Programando em Delphi XE
Aprenda programar Delphi
Banco de Dados RAD Delphi
Delphi Programming Projects