nsi-language: PT-BR">Como aplicar conceitos de POO em aplicações PHP? – Parte 2

 

Como prometido em meu primeiro artigo vamos dar continuidade a este assunto tão extenso que é a orientação a Objetos. Como dito anteriormente toda linguagem dita OO deve estar apoiada nos pilares desta filosofia que são: Herança, Encapsulamento, Abstração e Polimorfismo e o PHP 5 implementa essas quatro características inclusive o polimorfismo que é o foco do nosso artigo.

Muitos programadores vêem a herança como a solução de seus problemas, porém se usada indiscriminadamente ele pode ser um feitiço que se vira contra o feiticeiro, isto porque se não tomarmos os devidos cuidado acabamos por acoplar todo o nosso código através da herança. Porém se há algo que justifique o uso da herança este se chama polimorfismo.

O polimorfismo é um dos assuntos mais importantes na POO. Com o uso de classes e heranças conseguimos facilmente descrever uma situação da vida real além de conseguir estender projetos por meios da reutilização de código. Mas se de um lado o polimorfismo é um dos assuntos mais importantes da POO é também sem dúvida nenhuma um dos mais difíceis de ser compreendido. Isto porque muitos que se aventuram pela primeira vez na OO entram ainda com uma mentalidade procedural e enxergando as classes como entidades do banco de dados tornando mais difícil a compreensão da POO como um todo.

 

Nota do DevMan

O termo Programação Procedural (ou programação procedimental) é às vezes utilizado como sinônimo de Programação Imperativa (paradigma de programação que especifica os passos que um programa deve seguir para alcançar um estado desejado), mas o termo pode se referir (como neste artigo) a um paradigma de programação baseado no conceito de chamadas a procedimentos. Procedimentos, também conhecidos como rotinas, sub-rotinas, métodos, ou funções simplesmente contêm um conjunto de passos computacionais a serem executados. Um dado procedimento pode ser chamado a qualquer hora durante a execução de um programa, inclusive por outros procedimentos ou por si mesmo.

 

Polimorfismo

Teoricamente e a grosso modo entende-se por polimorfismo “a capacidade que um mesmo método tem de se comportar de maneira diferente dependendo de qual classe ele foi chamado”. Nós conseguimos isso declarando um método em uma classe base e o sobrescrevemos em uma classe herdada, facilitando assim o desenvolvimento e reaproveitamento códigos.

Antes de mais nada é importante deixar claro que a linguagem que estamos trabalhando é o PHP e que o mesmo é interpretado, fracamente tipado e sendo assim não há a necessidade de se declarar variáveis com seus tipos. Mas o que isso tem a ver com polimorfismo? Tudo! Observe o código da Listagem 1.

 

Listagem 1. Polimorfismo no Delphi Win32

 

unit SeresVivos;

 

interface

 

type

  TServivo = class

    procedure ProduzirSom;

  end;

 

  TCachorro = class(TServivo)

    procedure ProduzirSom; 

  end;

 

  THomem = class(TServivo)

    procedure ProduzirSom; 

  end;

 

implementation

 

uses

  SysUtils, Dialogs;

 

{ TCachorro }

 

procedure TCachorro.ProduzirSom;

begin

  ShowMessage('Cachorro Latindo !!!');

end;

 

{ TServivo }

 

procedure TServivo.ProduzirSom;

begin

  raise Exception.Create('Nem todo ser vivo produz

    som !');

end;

 

{ THomem }

 

procedure THomem.ProduzirSom;

begin

  ShowMessage('Homem Falando !!!');

end;

 

end.

 

procedure TForm1.Button1Click(Sender: TObject);

var

  Ser: TSerVivo;

begin

  Ser := THomem.Create;

  Ser.ProduzirSom;

end;

 

No código da Listagem 1 será levantada uma exceção no evento OnClick do botão com a mensagem “Nem todo ser vivo produz som!!!” mesmo um objeto do tipo THomem sendo instanciado para a variável Ser. Isso acontece porque no Delphi os métodos são estáticos por padrão. Isso significa que independente do objeto que seja instanciado na variável vale para ela o tipo que foi declarado. Para conseguirmos o efeito desejado, ou seja, o método ProduzirSom da classe THomem seja chamado, é preciso declarar o método ProduzirSom na classe TSerVivo como Virtual.

Isso faz com que o Delphi crie uma VMT(“Virtual Method Table”) uma tabela com os ponteiros dos métodos que foram declarados como virtuais para que possam ser sobrescritos em tempo de execução. Na ...

Quer ler esse conteúdo completo? Tenha acesso completo