Poo no Perl!

Boas pessoal. Tô de volta. :)

Depois de um bom tempo sem postar nada, vou aproveitar minha semaninha de folga pra tirar as teias do porão e vamos falar um pouquinho sobre orientação a objetos no Perl.

Mas o Perl é um cara sem classe, não?

No Perl realmente não existe uma palavra mágica class ou algo do tipo, mas a gente pode criar classes sim!

As classes no Perl são criadas o mecanismo de package que também é usado mais usualmente para criar módulos tradicionais. E os objetos... bom, os objetos são referências abençoadas ! :P

Referência abençoada? Que diabo é isso?

Calma... nada de misticismos. Uma referência abençoada é só uma referência que foi passada como argumento para a função bless. É essa função a responsável por dizer: 'essa referência pertence a este package (classe)'. Depois de abençoada, você será capaz de chamar funções através dessa referência, ou, em outras palavras, você terá métodos!

Entendi, mas já cansei de papo...

Beleza, já falei bastente, e agora é hora do código.

Pra este exemplo vou criar uma classe (package) Pessoa (como um módulo normal do Perl, isso será gravado em um arquivo chamado Pessoa.pm), e nessa classe criarei o contrutor da classe e os seus outros métodos. Agora sim, o código:


1package Pessoa; # Arquivo Pessoa.pm
2
3use strict;
4use warnings;
5
6# Aqui é o contrutor da classe.
7# O nome 'new' não é uma obrigação, só
8# uma convenção de uso.
9sub new{
10 # classe onde o a referência será abençoada.
11 # Isso aqui não precisa ser passado como parâmetro
12 # na hora de instanciar o objeto, é passado implicitamente
13 my $class = shift;
14
15 # Nossa referência que será abençoada.
16 # Pode ser uma referência qualquer, não necessáriamente
17 # uma referência a um hash;
18 my $self = {};
19 $self->{NOME} = undef;
20 $self->{IDADE} = undef;
21
22 # Agora a mágica acontece
23 bless($self, $class);
24
25 return $self;
26}
27
28
29# Métodos pra proteger o acesso aos nossos atributos
30sub nome{
31 # Como $class no contrutor, $self aqui também é parâmetro implícito
32 my $self = shift;
33 $self->{NOME} = shift if @_;
34 return $self->{NOME};
35}
36
37sub idade{
38 my $self = shift;
39 $self->{IDADE} = shift if @_;
40 return $self->{IDADE};
41}
42
43# Outro metodozinho só de exemplo
44sub fale{
45 my $self = shift;
46 my $fala = shift || "Qualquer coisa";
47 return $fala
48}
49
50# Precisa retornar um valor verdadeiro
511;


 

Agora, vamos criar uma subclasse de Pessoa


1package PessoaMuda; # Arquivo PessoaMuda.pm
2
3# Importando a super classe
4use Pessoa;
5
6# Aqui estamos dizendo que PessoaMuda é uma Pessoa
7@ISA = (Pessoa);
8
9# Sobrescrevendo o método fale pra que retorne nada...
10sub fale{
11 my $self = shift;
12 return
13}
14
151;


 

E, por fim, vamos usar nossos objetos


1#!/usr/bin/env perl
2
3use strict;
4use warnings;
5
6# Importando nossas classes
7use Pessoa;
8use PessoaMuda;
9
10# Nova instância de Pessoa;
11my $p = Pessoa->new();
12$p->nome('Alguém');
13print $p->nome();
14
15$p->idade(10000);
16print $p->idade();
17
18print $p->fale('Eu nasci a 10000 anos atrás...') . "\n";
19
20# Uma pessoa muda
21my $pm = PessoaMuda->new();
22$pm->nome('Ninguém');
23print $pm->nome();
24
25$pm->idade(10000);
26print $pm->idade();
27
28# Mudos não falam, lembra? Sobrescrevemos o método...
29print $pm->fale('Alguma coisa');

 

Bom, é isso! Pra mais sobre orientação a objetos no Perl, leiam o perltoot.

Valeu, e até a próxima!

Comentários

Faça seu comentário