OK. Ho un problema nel tentativo di ereditare le costanti impostate in una classe genitore per una qualsiasi delle classi figlie.Costanti ereditabili con pacchetti in linea
#!/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__
L'errore è:
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.
Ora, io non sono venuto qui per spedire senza fare qualche ricerca. Comprendo che un'opzione potrebbe essere use Car qw(WHEELS WINGS)
in Car::Sports
. Tuttavia, se faccio che ottengo il seguente errore, perché le classi sono tutte in linea nello stesso file:
Can't locate Car.pm in @INC
Per una serie di ragioni, ho bisogno di tenere i miei pacchetti in un unico file. C'è un modo per aggirare questo? Poiché le costanti sono fondamentalmente solo subs, perché devo importarle quando lo stesso non sarebbe vero per un metodo normale?
Infine, so anche che posso fare questo:
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;
}
E va bene ... Ma ho un numero di classi e vuole fare l'eredità delle costanti più generico che dover nominare il genitore classe esplicitamente (e a volte non è solo la classe genitore, ma il nonno).
Molte grazie in anticipo per eventuali suggerimenti!
Acclamazioni
Perfetto! L'hai spiegato davvero bene e mi hai insegnato qualcosa! – wawawawa
Inoltre, rendendo 'Car :: Sports' una sottoclasse di' Car' darà accesso a 'Car :: Sports' ai metodi di' Car' * *, ma non le sue * funzioni * come '& WHEELS' e' & WINGS'. Chiamare 'use base qw (Car)' è superfluo finché non si aggiungono altri metodi alla classe 'Car'. – mob