La herencia en Perl se implementa mediante el array @ISA, que indica de qué paquetes (clases) hereda el paquete actual. No es una OO tradicional, como en muchos otros lenguajes, sino más bien un ajuste dinámico de padres durante la búsqueda de métodos.
En las primeras versiones de Perl no había un enfoque de objeto estándar. Para soportar la herencia, se introdujo el array @ISA (ISA = Es Un), en el que se enumeran las clases padres. Perl busca métodos primero en la clase del objeto mismo, luego en los padres en orden, lo que da cierta flexibilidad, pero genera sus propias particularidades.
Los métodos de herencia a través de @ISA pueden romper fácilmente la encapsulación. Además, la herencia multinivel (múltiple) requiere un manejo cuidadoso del orden de los padres para evitar conflictos inesperados de métodos. Un punto importante es el orden de búsqueda de métodos (Method Resolution Order), que no siempre es obvio, especialmente al usar módulos de CPAN (por ejemplo, clases de Moose, base o parent).
Para una herencia simple en Perl se utiliza la declaración del array @ISA:
package Parent; sub hello { print "¡Hola desde el padre! "; } package Child; our @ISA = ('Parent'); Child::hello(); # Imprimirá: ¡Hola desde el padre!
En proyectos reales, a menudo se utiliza la pragma base o parent para simplificar el trabajo con la herencia y mejorar la seguridad.
@ISA.¿Puede la pragma BASE o el uso del array @ISA agregar métodos del padre a la clase hija después de ejecutar el programa?
No, Perl permite la herencia durante la compilación del script, no durante la ejecución. Si se realizan cambios en @ISA durante la ejecución, realmente afectarán a no todos los objetos ya declarados, lo que puede causar problemas extraños.
package Parent; sub hello { print "padre "; } package Child; our @ISA = ('Parent'); # tras la creación de objetos, no se recomienda cambiar @ISA
¿Qué sucederá si se declara el mismo método en varias clases padres en @ISA?
Se llamará al primero encontrado en el orden especificado en @ISA. Esto puede resultar en un comportamiento inesperado, especialmente con la herencia múltiple.
package Base1; sub hello { print "Base1 "; } package Base2; sub hello { print "Base2 "; } package Derived; our @ISA = ('Base1', 'Base2'); Derived::hello(); # Imprimirá: Base1
¿Es posible agregar dinámicamente una clase a @ISA y acceder a sus métodos?
Sí, pero se recomienda encarecidamente no hacerlo, ya que rompe la estructura del programa, puede llevar a errores en la resolución de métodos y errores en tiempo de ejecución.
@ISA durante la ejecución del programaparent/base, lo que reduce la mantenibilidadEn un proyecto, para agregar funcionalidad a clases-protocolo, manualmente se cambian los arrays @ISA en un ciclo para heredar métodos de módulos que se cargan dinámicamente bajo ciertas condiciones.
Ventajas:
Desventajas:
Para extender una clase, se utiliza la pragma parent, controlando estrictamente el orden de los padres y definiendo explícitamente los métodos que pueden ser sobrescritos.
Ventajas:
Desventajas: