2009-09-04 7 views
9

Quiero hacer una clase singleton que amplíe DBI. debería hacer algo como esto:¿Cuál es la diferencia entre `use base` y @ISA en Perl?

use base 'Class::Singleton'; 
our @ISA = ('DBI');

o esto:

our @ISA = ('Class::Singleton', 'DBI');

o alguna otra cosa?

No estoy seguro de cuál es la diferencia entre 'base de uso' e 'isa'.

+2

Bueno, la documentación base.pm le indica la diferencia. –

Respuesta

4

Creo que debería utilizar el pragma parent en lugar de base como se ha sugerido en perldoc base.

+1

¿Es 'padre' nuevo en 5.10? Debe ser, ya que no está en mi documentación 5.8. – Ether

+0

No estoy seguro. Sin embargo, citando la declaración de Chas: "... El pragma padre es nuevo a partir de Perl 5.10.1, pero es instalable desde CPAN si tiene una versión anterior de Perl ..." –

8

El uso típico de @ISA es

package Foo; 

require Bar; 
our @ISA = qw/Bar/; 

Los base y parent pragmas tanto cargar la clase solicitada y modificar @ISA incluirlo:

package Foo; 

use base qw/Bar/; 

Si desea herencia múltiple, se puede suministrar más de un módulo a base o parent:

package Foo; 

use parent qw/Bar Baz/; #@ISA is now ("Bar", "Baz"); 

El pragma parent es nuevo a partir de Perl 5.10.1, pero es instalable desde CPAN si tiene una versión anterior de Perl. Fue creado porque el pragma base se había vuelto difícil de mantener debido a "restos que se habían acumulado en él". No debería ver una diferencia en el uso básico entre los dos.

3

de perldoc de la base ...

package Baz; 

use base qw(Foo Bar); 

es esencialmente equivalente a

package Baz; 

BEGIN { 
    require Foo; 
    require Bar; 
    push @ISA, qw(Foo Bar); 
} 

Personalmente, yo uso base.

+1

El último base.pm le dice a las personas use parent, que está en 5.10.1. :) –

0

Si desea heredar la clase principal, deberá cargarla y modificar @ISA. Estos dos pasos se solucionan cuando usa Base. Base carga el módulo por usted y modifica @ISA en consecuencia. De lo contrario, necesitaría modificar @ISA y cargar el módulo principal por su cuenta.

los dos ejemplos siguientes son equivalentes:

use base "Parent"; 

y

require Parent; 
@ISA = ("Parent"); 
Cuestiones relacionadas