Curso de Programação Orientada a Objetos – 2.5 Polimorfismo

2.5 Polimorfismo
O polimorfismo é um dos pilares fundamentais da Programação Orientada a Objetos (POO). Ele permite que métodos em classes derivadas tenham comportamentos diferentes, mesmo que compartilhem a mesma assinatura de métodos definidos na classe base. O polimorfismo é alcançado por meio de métodos virtuais e sobrescritos, utilizando as palavras-chave virtual e override em Delphi e Lazarus.
Para demonstrar o conceito, vamos expandir o exemplo das contas bancárias usado anteriormente. Implementaremos métodos que exibem informações específicas para cada tipo de conta, mostrando como o polimorfismo pode ser utilizado.
Exemplo Prático: Polimorfismo com Contas Bancárias
- Classe Base (
TContaBancaria):- Define um método
ExibirDetalhesque será sobrescrito pelas classes derivadas.
- Define um método
- Classes Derivadas (
TContaPoupancaeTContaCorrente):- Cada classe fornece uma implementação específica para
ExibirDetalhes.
- Cada classe fornece uma implementação específica para
Código da Classe Base TContaBancaria
unit ContaBancariaUnit;
interface
type
TContaBancaria = class
private
FSaldo: Currency;
FTitular: string;
public
constructor Create(Titular: string; SaldoInicial: Currency);
procedure Depositar(Valor: Currency);
function Sacar(Valor: Currency): Boolean;
procedure ExibirDetalhes; virtual; // Método virtual para polimorfismo
property Saldo: Currency read FSaldo;
property Titular: string read FTitular;
end;
implementation
uses
SysUtils;
{ TContaBancaria }
constructor TContaBancaria.Create(Titular: string; SaldoInicial: Currency);
begin
FTitular := Titular;
FSaldo := SaldoInicial;
end;
procedure TContaBancaria.Depositar(Valor: Currency);
begin
FSaldo := FSaldo + Valor;
end;
function TContaBancaria.Sacar(Valor: Currency): Boolean;
begin
if Valor <= FSaldo then
begin
FSaldo := FSaldo - Valor;
Result := True;
end
else
Result := False;
end;
procedure TContaBancaria.ExibirDetalhes;
begin
WriteLn('Titular: ', FTitular);
WriteLn('Saldo Atual: ', FSaldo:0:2);
end;
end.
Código da Classe Derivada TContaPoupanca
unit ContaPoupancaUnit;
interface
uses
ContaBancariaUnit;
type
TContaPoupanca = class(TContaBancaria)
private
FTaxaJuros: Double;
public
constructor Create(Titular: string; SaldoInicial: Currency; TaxaJuros: Double);
procedure AplicarJuros;
procedure ExibirDetalhes; override; // Sobrescrevendo o método virtual
end;
implementation
{ TContaPoupanca }
constructor TContaPoupanca.Create(Titular: string; SaldoInicial: Currency; TaxaJuros: Double);
begin
inherited Create(Titular, SaldoInicial);
FTaxaJuros := TaxaJuros;
end;
procedure TContaPoupanca.AplicarJuros;
begin
Depositar(Saldo * FTaxaJuros);
end;
procedure TContaPoupanca.ExibirDetalhes;
begin
inherited;
WriteLn('Tipo de Conta: Poupança');
WriteLn('Taxa de Juros: ', FTaxaJuros * 100:0:2, '%');
end;
end.
Código da Classe Derivada TContaCorrente
unit ContaCorrenteUnit;
interface
uses
ContaBancariaUnit;
type
TContaCorrente = class(TContaBancaria)
private
FTaxaManutencao: Currency;
public
constructor Create(Titular: string; SaldoInicial: Currency; TaxaManutencao: Currency);
procedure CobrarManutencao;
procedure ExibirDetalhes; override; // Sobrescrevendo o método virtual
end;
implementation
{ TContaCorrente }
constructor TContaCorrente.Create(Titular: string; SaldoInicial: Currency; TaxaManutencao: Currency);
begin
inherited Create(Titular, SaldoInicial);
FTaxaManutencao := TaxaManutencao;
end;
procedure TContaCorrente.CobrarManutencao;
begin
Sacar(FTaxaManutencao);
end;
procedure TContaCorrente.ExibirDetalhes;
begin
inherited;
WriteLn('Tipo de Conta: Corrente');
WriteLn('Taxa de Manutenção: ', FTaxaManutencao:0:2);
end;
end.
Exemplo de Uso do Polimorfismo
Agora, criamos um programa que utiliza o polimorfismo para exibir os detalhes de diferentes tipos de contas.
program ExemploPolimorfismo;
uses
ContaBancariaUnit, ContaPoupancaUnit, ContaCorrenteUnit;
var
Conta: TContaBancaria;
Contas: array[1..2] of TContaBancaria;
begin
// Criando uma conta poupança
Contas[1] := TContaPoupanca.Create('Alice', 1000.00, 0.02);
TContaPoupanca(Contas[1]).AplicarJuros;
// Criando uma conta corrente
Contas[2] := TContaCorrente.Create('Bob', 500.00, 15.00);
TContaCorrente(Contas[2]).CobrarManutencao;
// Exibindo detalhes de cada conta (polimorfismo em ação)
for Conta in Contas do
begin
Conta.ExibirDetalhes;
WriteLn('---');
end;
// Liberando memória
for Conta in Contas do
Conta.Free;
end.
Explicação
- Método Virtual:
ExibirDetalhesé declarado comovirtualna classe base para permitir que as classes derivadas o sobrescrevam.
- Sobrescrita:
- As classes
TContaPoupancaeTContaCorrenteimplementam suas próprias versões deExibirDetalhesusando a palavra-chaveoverride.
- As classes
- Polimorfismo em Ação:
- No programa principal, o método
ExibirDetalhesé chamado para objetos de diferentes tipos (TContaPoupancaeTContaCorrente), mas o comportamento correto é definido em tempo de execução.
- No programa principal, o método
Conclusão
O polimorfismo simplifica a implementação de soluções escaláveis, permitindo tratar diferentes tipos de objetos de maneira uniforme. Em Delphi e Lazarus, o uso de métodos virtuais e sobrescritos é essencial para explorar todo o potencial dessa poderosa característica da POO.
Continue o curso no próximo post!
Curso de Programação Orientada a Objetos – 2.6 Composição, Agregação e Associação
#Polimorfismo #POO #CursoDeProgramação #ProgramaçãoOrientadaAObjetos
#DevIniciante #GiovaniDaCruz #CódigoLimpo #AprendaProgramação
#LógicaDeProgramação #DesenvolvimentoDeSoftware #CompartilheConhecimento
#DicaDeDev #Delphi #Lazarus #Pascal