Hoje vamos ver que o compilador do Delphi 2005 faz mágicas.
Helper
A palavra Helpers é utilizada no Delphi para criar uma extensão de uma classe, podendo assim dividi-la em duas Units, sem precisar herdá-la. Uma das mais novas características da linguagem e do poderoso compilador Delphi, é poder estender novas funcionalidades às classes já existentes, podendo assim construir novos métodos e propriedades sem ter que criar uma nova classe herdando-a.
A razão principal deste recurso implantado no compilador pela Borland foi a necessidade de estender as classes existentes na VCL para VCL.NET. na Listagem 1. veremos um exemplo de como é feito o uso de uma classe helper.
Listagem 1. Aqui está um exemplo como estender uma classe com helpers.
TPessoa = class
procedure SomaSalario;
end;
TPessoaFisica = class helper for TPessoa
function ValidaCPF(Value: string) Boolean;
end;
Com as definições da classe acima, podemos usar-la da seguinte maneira:
var
objPessoa: TPessoa;
begin
objPessoa := TPessoa.Create;
objPessoa.ValidaCPF(’00.000.000-00’);
...
Limitações
Você não pode estender uma classe se ela já for à extensão de outra classe. Veja na listagem 2.
Listagem 2. Limitação de uso do Helpers
TPessoa = class; // OK
TPessoaFisica = class helper for TPessoa; // OK
TPessoaFisicaPobre = class helper for TPessoaFisica // Isto não funcionará
Dúvidas
Quando podemos utilizar estes recursos em nosso dia a dia? Para que estender uma classe?
1. Quando você trabalha em equipe, podemos usar o recurso de ter vários colaboradores trabalhando em uma mesma classe mas teríamos que usar um gerenciador de código fonte como o Starteam para fazer check-in/check-out e mesclar as alterações de cada um. Usando classes estendidas podemos dividir nossa classe para que cada programador trabalhe em uma classe estendida (cada classe estendida seria uma unit), ai quem tem o trabalho de juntar os códigos da classe e suas classes estendidas seria o compilador.
2. Vejamos a necessidade de manter duas versões de seu produto, onde uma versão tem mais características que outra (isto é "profissional" e versão "padrão"). As classes estendidas permitem que você adicione todas as características para a versão "profissionais" que ficará em uma unit separada. Quando você gerar a versão "padrão", você simplesmente valida o tipo da versão e não compila unit da versão "profissionais".
Teríamos N motivos e necessidades para usar classes estendidas, mas nosso foco é no recurso que o compilador Delphi nos oferece.
Na Prática
Vamos a um exemplo onde estenderemos uma classe para compreender como a classe estendida funciona na prática. O projeto tem duas units. A unit "Automovel.pas" define a classe de TAutomovel com um procedimento "LigarLimpadorDianteiro" da classe. A unit "ArCondicionado.pas" define uma classe de TArCondicionado estendida da classe TAutomovel. TArCondicionado irá implementar o procedimento “LigarArCondicionado" à classe de TAutomovel. Vejamos na Listagem 3.
Listagem 3. Na prática com estender uma classe.
{ Classe TAutomovel }
unit Automovel;
interface
uses Dialogs;
type
TAutomovel = class
class procedure LigarLimpadorDianteiro;
end;
implementation
{ TAutomovel }
class procedure Tautomovel.LigarLimpadorDianteiro;
begin
ShowMessage('Limpador Ligado .');
end;
end.
{ Classe estendida da TAutomovel chamada de TArCondicionado }
unit ArCondicionado;
interface
uses Dialogs, Automovel;
type
TArCondicionado = class helper for TAutomovel
class procedure LigarArCondicionado;
end;
implementation
{ TArCondicionado }
procedure TArCondicionado.LigarArCondicionado;
begin
ShowMessage('Ar Condicionado Ligado.');
end;
end.
{ Utilização da classe TAutomovel e da classe estendida TArCondicionado }
unit Helpers;
…
uses Automovel, ArCondicionado;
{$R *.dfm}
procedure TfrmHelpers.LipadorDianteiroClick(Sender: TObject);
begin
// Aqui dispara o método da classe TAutomovel.
TAutomovel.LigarLimpadorDianteiro;
end;
procedure TfrmHelpers.ArCondicionadoClick(Sender: TObject);
begin
// Aqui dispara o método da classe estendida que é TArcondicionado
// extensão do TAutomovel.
TAutomovel.LigarArCondicionado;
end;
end.
Todos os direitos reservados