Existem duas implementações diferentes de programação orientada a objetos em Perl:
Um é baseado no método de tabela hash anônima. A essência de cada instância de objeto é uma referência que aponta para a tabela hash anônima. Nesta tabela hash anônima, todos os atributos da instância são armazenados.
O segundo é baseado no método array. Ao definir uma classe, criaremos um array para cada atributo de instância, e a essência de cada instância de objeto é uma referência que aponta para um índice de linha nesses arrays. Nessas matrizes, todas as propriedades da instância são armazenadas.
Existem muitos conceitos básicos em orientação a objetos, aqui aceitamos três: objetos, classes e métodos.
Objeto : Um objeto é uma referência a um item de dados em uma classe. .
Classe : uma classe é um pacote Perl que contém classes que fornecem métodos de objeto.
Método : um método é uma sub-rotina Perl e o nome da classe é seu primeiro parâmetro.
Perl fornece a função Blessed() que é usada para construir objetos. Bless associa uma referência ao nome da classe e constrói um objeto retornando a referência.
Uma classe é apenas um pacote simples.
Você pode usar um pacote como uma classe e usar as funções do pacote como métodos da classe.
Os pacotes Perl fornecem namespaces independentes, portanto nomes de métodos e variáveis em pacotes diferentes não entrarão em conflito.
A extensão do arquivo para classes Perl é .pm.
Em seguida, criamos uma classe Person:
pacote Pessoa;
O intervalo de código da classe atinge a última linha do arquivo de script ou antes da próxima palavra-chave do pacote.
Para criar uma instância (objeto) de uma classe, precisamos definir um construtor. A maioria dos programas usa o nome da classe como construtor, mas qualquer nome pode ser usado em Perl.
Você pode usar várias variáveis Perl como objetos Perl. Na maioria das vezes usaremos arrays de referência ou hashes.
A seguir criamos um construtor para a classe Person, usando a referência hash do Perl.
Ao criar um objeto, você precisa fornecer um construtor, que é uma sub-rotina que retorna uma referência ao objeto.
Os exemplos são os seguintes:
Em seguida, criamos um objeto:
$objeto = nova Pessoa( "Xiao Ming", "王", 23234345);
O método da classe Perl é apenas uma sub-rotina Perl, comumente conhecida como função membro.
A definição do método Perl em Perl orientado a objetos não fornece nenhuma sintaxe especial, mas estipula que o primeiro parâmetro do método é um objeto ou seu pacote referenciado.
Perl não fornece variáveis privadas, mas podemos gerenciar dados de objetos através de métodos auxiliares.
A seguir definimos um método para obter o nome:
sub getFirstName { return $self->{_firstName};}
Você também pode escrever assim:
sub setFirstName { meu ( $self, $firstName ) = @_; $self->{_firstName} = $firstName if definido($firstName ) return $self->{_firstName};}
A seguir, modificamos o código do arquivo Person.pm da seguinte forma:
O código do script Employee.pl é o seguinte:
Depois de executar o programa acima, o resultado de saída é:
$ perl Employee.pl Nome: Xiao Ming Sobrenome: Wang Número: 23234345 O nome antes da configuração é: Xiao Ming Nome após a configuração: Xiao Qiang
Os métodos de classe em Perl são herdados através do array @ISA. Este array contém os nomes de outros pacotes (classes). A herança de variáveis deve ser definida explicitamente.
Herança múltipla significa que o array @ISA contém vários nomes de classes (pacotes).
Somente métodos podem ser herdados através do @ISA, não dados.
A seguir criamos uma classe Employee que herda a classe Person.
O código do arquivo Employee.pm é semelhante a este:
Agora a classe Employee contém todos os métodos e propriedades da classe Person. Insira o seguinte código no arquivo main.pl e execute-o:
Depois de executar o programa acima, o resultado de saída é:
$ perl main.pl Nome: Xiao Ming Sobrenome: Wang Número: 23234345 O nome antes da configuração é: Xiao Ming Nome após a configuração: Xiao Qiang
No exemplo acima, a classe Employee herda a classe Person, mas se os métodos da classe Person não puderem atender aos requisitos, seus métodos precisarão ser reescritos.
A seguir, adicionamos alguns novos métodos à classe Employee e sobrescrevemos os métodos da classe Person:
Inserimos o seguinte código no arquivo main.pl e o executamos:
Depois de executar o programa acima, o resultado de saída é:
$ perl main.pl Nome: Xiao Ming Sobrenome: Wang Número: 23234345 Este é o nome da função de subclasse antes de definir: Xiao Ming Este é o nome da função de subclasse após a configuração: Xiaoqiang
Se o método solicitado não puder ser encontrado na classe atual, em todas as classes base da classe atual ou na classe UNIVERSAL, um método chamado AUTOLOAD() será pesquisado novamente. Se AUTOLOAD for encontrado, ele será chamado e a variável global $AUTOLOAD será definida como o nome completo do método ausente.
Se isso não funcionar, o Perl falhará com um erro.
Se você não quer herdar o AUTOLOAD da classe base, é muito simples, basta uma frase:
subCARREGAMENTO AUTOMÁTICO;
O objeto é automaticamente destruído quando a última referência ao objeto é liberada.
Se quiser fazer algo durante a destruição, você pode definir um método chamado "DESTROY" na classe. Ele será chamado automaticamente no momento apropriado e executará ações de limpeza adicionais conforme desejar.
package MinhaClasse;...sub DESTROY{ print "MinhaClasse::DESTROY chamadon";}
Perl passará a referência do objeto como único parâmetro para DESTROY. Observe que esta referência é somente leitura, o que significa que você não pode modificá-la acessando $_[0]. (Nota do tradutor: consulte perlsub) Mas o próprio objeto (como "${$_[0]" ou "@{$_[0]}" e "%{$_[0]}", etc.) pode ainda estar escrito.
Se você abençoar novamente uma referência de objeto antes do retorno do destruidor, Perl chamará o método DESTROY do objeto que você abençoou novamente após o retorno do destruidor. Isso lhe dá a oportunidade de chamar o destruidor da classe base ou de outras classes que você especificar. Deve-se observar que DESTROY também pode ser chamado manualmente, mas geralmente não é necessário fazê-lo.
Depois que o objeto atual for liberado, outros objetos contidos no objeto atual serão liberados automaticamente.
Podemos entender melhor a aplicação orientada a objetos do Perl por meio dos seguintes exemplos:
Executando o programa acima, o resultado de saída é:
Chame o método MyClass MyClass::new chamadoMyClass::MyMethod chamado! Chame o método MySubClass MySubClass::new chamadoMyClass::new chamadoMyClass::MyMethod chamado! chamado Criar objeto MyClass::new chamadoMyClass::DESTROY a execução do script chamado termina...MyClass::DESTROY chamadoMySubClass::DESTROY chamado