Hay dos implementaciones diferentes de programación orientada a objetos en Perl:
Uno se basa en el método de la tabla hash anónima. La esencia de cada instancia de objeto es una referencia a la tabla hash anónima. En esta tabla hash anónima, se almacenan todos los atributos de la instancia.
El segundo es el método basado en matrices. Al definir una clase, crearemos una matriz para cada atributo de instancia, y la esencia de cada instancia de objeto es una referencia que apunta a un índice de fila en estas matrices. En estas matrices, se almacenan todas las propiedades de la instancia.
Hay muchos conceptos básicos en orientación a objetos, aquí aceptamos tres: objetos, clases y métodos.
Objeto : un objeto es una referencia a un elemento de datos en una clase. .
Clase : una clase es un paquete Perl que contiene clases que proporcionan métodos de objeto.
Método : un método es una subrutina de Perl y el nombre de la clase es su primer parámetro.
Perl proporciona la función bless(). Bless se utiliza para construir objetos. Bless asocia una referencia con el nombre de la clase y construye un objeto devolviendo la referencia.
Una clase es sólo un paquete simple.
Puede usar un paquete como una clase y usar las funciones del paquete como métodos de la clase.
Los paquetes de Perl proporcionan espacios de nombres independientes, por lo que los nombres de métodos y variables en diferentes paquetes no entrarán en conflicto.
La extensión de archivo para las clases de Perl es .pm.
A continuación creamos una clase Persona:
paquete Persona;
El rango de código de la clase llega a la última línea del archivo de script o antes de la siguiente palabra clave del paquete.
Para crear una instancia (objeto) de una clase necesitamos definir un constructor. La mayoría de los programas usan el nombre de la clase como constructor, pero en Perl puedes usar cualquier nombre.
Puede utilizar varias variables de Perl como objetos Perl. La mayoría de las veces usaremos matrices de referencia o hashes.
A continuación creamos un constructor para la clase Persona, utilizando la referencia hash de Perl.
Al crear un objeto, es necesario proporcionar un constructor, que es una subrutina que devuelve una referencia al objeto.
Los ejemplos son los siguientes:
A continuación creamos un objeto:
$objeto = nueva Persona( "Xiao Ming", "王", 23234345);
El método de la clase Perl es simplemente una subrutina de Perl, que comúnmente se conoce como función miembro.
La definición del método de Perl en Perl orientado a objetos no proporciona ninguna sintaxis especial, pero estipula que el primer parámetro del método es el objeto o su paquete al que se hace referencia.
Perl no proporciona variables privadas, pero podemos gestionar datos de objetos mediante métodos auxiliares.
A continuación definimos un método para obtener el nombre:
sub getFirstName { return $self->{_firstName};}
También puedes escribir así:
sub setFirstName { my ($self, $firstName ) = @_; $self->{_firstName} = $firstName si está definido($firstName) return $self->{_firstName};}
A continuación modificamos el código del archivo Person.pm de la siguiente manera:
El código del script empleado.pl es el siguiente:
Después de ejecutar el programa anterior, el resultado de salida es:
$ perl Employee.pl Nombre: Xiao Ming Apellido: Wang Número: 23234345 El nombre antes de la configuración es: Xiao Ming Nombre después de la configuración: Xiao Qiang
Los métodos de clase en Perl se heredan a través de la matriz @ISA. Esta matriz contiene los nombres de otros paquetes (clases). La herencia de variables debe establecerse explícitamente.
La herencia múltiple significa que la matriz @ISA contiene múltiples nombres de clases (paquetes).
A través de @ISA solo se pueden heredar métodos, no datos.
A continuación creamos una clase de Empleado que hereda la clase Persona.
El código del archivo Employee.pm tiene este aspecto:
Ahora la clase Empleado contiene todos los métodos y propiedades de la clase Persona Ingresamos el siguiente código en el archivo main.pl y lo ejecutamos:
Después de ejecutar el programa anterior, el resultado de salida es:
$ perl main.pl Nombre: Xiao Ming Apellido: Wang Número: 23234345 El nombre antes de la configuración es: Xiao Ming Nombre después de la configuración: Xiao Qiang
En el ejemplo anterior, la clase Empleado hereda la clase Persona, pero si los métodos de la clase Persona no pueden satisfacer las necesidades, es necesario reescribir sus métodos.
A continuación agregamos algunos métodos nuevos a la clase Empleado y anulamos los métodos de la clase Persona:
Introducimos el siguiente código en el archivo main.pl y lo ejecutamos:
Después de ejecutar el programa anterior, el resultado de salida es:
$ perl main.pl Nombre: Xiao Ming Apellido: Wang Número: 23234345 Este es el nombre de la función de subclase antes de configurar: Xiao Ming Este es el nombre de la función de subclase después de configurar: Xiaoqiang
Si el método solicitado no se encuentra en la clase actual, en todas las clases base de la clase actual y en la clase UNIVERSAL, se busca nuevamente un método llamado AUTOLOAD(). Si se encuentra AUTOLOAD, se llama y la variable global $AUTOLOAD se establece en el nombre completo del método que falta.
Si eso no funciona, Perl falla con un error.
Si no desea heredar AUTOLOAD de la clase base, es muy simple, solo una oración:
subCARGA AUTOMÁTICA;
El objeto se destruye automáticamente cuando se publica la última referencia al objeto.
Si desea hacer algo durante la destrucción, puede definir un método llamado "DESTROY" en la clase. Se llamará automáticamente en el momento adecuado y realizará acciones de limpieza adicionales según lo desee.
paquete MiClase;...sub DESTRUIR{ print "MiClase::DESTRUIR llamadon";}
Perl pasará la referencia del objeto como único parámetro para DESTRUIR. Tenga en cuenta que esta referencia es de solo lectura, lo que significa que no puede modificarla accediendo a $_[0]. (Nota del traductor: consulte perlsub) Pero el objeto en sí (como "${$_[0]" o "@{$_[0]}" y "%{$_[0]}", etc.) puede todavía estar escrito.
Si vuelve a bendecir una referencia de objeto antes de que regrese el destructor, Perl llamará al método DESTROY del objeto que volvió a bendecir después de que regrese el destructor. Esto le brinda la oportunidad de llamar al destructor de la clase base u otras clases que especifique. Cabe señalar que DESTROY también se puede llamar manualmente, pero normalmente no es necesario hacerlo.
Después de que se libere el objeto actual, otros objetos contenidos en el objeto actual se liberarán automáticamente.
Podemos comprender mejor la aplicación orientada a objetos de Perl a través de los siguientes ejemplos:
Al ejecutar el programa anterior, el resultado de salida es:
Llame al método MyClass MyClass::new llamadoMyClass::MyMethod llamado! Llame al método MySubClass MySubClass::new llamadoMyClass::new llamadoMyClass::MyMethod llamado! ¡Crea un objeto de alcance MyClass::new llamadoMyClass::DESTROY! llamado Crear objeto MyClass::new llamadoMyClass::DESTROY llamado la ejecución del script finaliza...MyClass::DESTROY llamadoMySubClass::DESTRUIR llamado