OK. Tengo un problema al tratar de heredar las constantes establecidas en una clase principal para cualquiera de las clases secundarias.Constantes Heredadas con paquetes en línea
#!/usr/bin/perl
use strict;
use warnings;
package Car;
use Exporter qw(import);
our @EXPORT_OK = ('WHEELS', 'WINGS');
use constant WHEELS => 4;
use constant WINGS => 0;
sub new {
my ($class, %args) = @_;
my $self = {
doors => $args{doors},
colour => $args{colour},
wheels => WHEELS,
wings => WINGS,
};
bless $self, $class;
return $self;
}
package Car::Sports;
use base qw(Car);
sub new {
my ($class, %args) = @_;
my $self = {
doors => $args{doors},
engine => $args{engine},
wheels => WHEELS,
wings => WINGS,
};
bless $self, $class;
return $self;
}
package main;
my $obj = Car->new(doors => 4, colour => "red");
print Dumper $obj;
my $obj2 = Car::Sports->new(doors => 5, engine => "V8");
print Dumper $obj2;
__END__
El error es:
Bareword "WHEELS" not allowed while "strict subs" in use at ./t.pl line 30.
Bareword "WINGS" not allowed while "strict subs" in use at ./t.pl line 30.
Execution of ./t.pl aborted due to compilation errors.
Ahora, no he venido aquí para publicar sin hacer algunas investigaciones. Entiendo que una opción sería use Car qw(WHEELS WINGS)
en Car::Sports
. Sin embargo, si hago lo que me sale el siguiente error, porque las clases son en línea en el mismo archivo:
Can't locate Car.pm in @INC
Por una variedad de razones, tengo que mantener mis paquetes en un solo archivo. ¿Hay alguna forma de evitar esto? Como las constantes son básicamente solo subs, ¿por qué tengo que importarlas cuando lo mismo no sería cierto para un método normal?
Por último, también sé que puedo hacer esto:
package Car::Sports;
use base qw(Car);
sub new {
my ($class, %args) = @_;
my $self = {
doors => $args{doors},
engine => $args{engine},
wheels => Car::WHEELS,
wings => Car::WINGS,
};
bless $self, $class;
return $self;
}
Y está bien ... pero tengo un número de clases y quiere hacer la herencia de las constantes más genérico que tener que nombrar al padre clase explícitamente (y a veces no es solo la clase principal, sino el abuelo).
¡Muchas gracias de antemano por cualquier apuntador!
Saludos
¡Perfecto! ¡Realmente lo has explicado bien y me enseñaste algo! – wawawawa
Además, al hacer 'Car :: Sports' una subclase de' Car' le dará acceso a 'Car :: Sports' a' cars * methods *, pero no a sus * funciones * como '& WHEELS' y' & WINGS'. Llamar 'use base qw (Car)' es superfluo hasta que agregue algunos más métodos a la clase 'Car'. – mob