好的。嘗試繼承任何子類的父類中設置的常量時遇到問題。用內聯包繼承常量
#!/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__
的錯誤是:
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.
現在,我還沒有來到這裏後沒有做一些研究。我明白,一個選項是use Car qw(WHEELS WINGS)
在Car::Sports
。但是,如果我這樣做,我得到以下錯誤,因爲類是在同一文件中的所有內聯:
Can't locate Car.pm in @INC
由於各種原因,我需要讓我的包在一個文件中。有沒有解決的辦法?由於常量基本上只是subs,所以爲什麼我必須導入它們,而對於普通方法來說,這不會是真的嗎?
最後,我也知道我可以做到這一點:
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;
}
而且它的罰款...但我有許多類,並希望使常數的繼承更通用的具有命名父類(有時它不只是父類,而是祖父母)。
非常感謝任何指針!
乾杯
完美!你已經很好地解釋了這一點並教會了我一些東西! – wawawawa
此外,將Car :: Sports作爲Car的一個子類,可以使'Car :: Sports'訪問'Car''s *方法*,但不能像'&WHEELS'和'&WINGS'那樣使用*函數。調用'use base qw(Car)'是多餘的,直到你爲Car類增加更多的方法。 – mob