OK。子クラスのいずれかの親クラスに設定された定数を継承しようとすると問題が発生します。インラインパッケージによる定数の継承
#!/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.
今、私はいくつかの研究を行うことなく、投稿するためにここに来ていません。 1つの選択肢がuse Car qw(WHEELS WINGS)
のCar::Sports
にあることを理解しています。私はクラスが同じファイル内のすべてのインラインですので、私は、次のエラーを取得することを行う場合は、:
Can't locate Car.pm in @INC
さまざまな理由のために、私は1つのファイルに私のパッケージを維持する必要があります。これを回避する方法はありますか?定数は基本的には潜在的なものであるため、通常のメソッドでは同じことが当てはまらないときに、なぜそれらをインポートする必要がありますか?
は最後に、私はまた、私はこれを行うことができます知っている:
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'の*メソッド*にアクセスできますが、 '&WHEELS'や'&WINGS'のような*関数は使用できません。あなたが 'Car'クラスにいくつかのメソッドを追加するまで、' use base qw(Car) 'を呼び出すことは余計です。 – mob