Tamam. Çocuk sınıflarının herhangi biri için bir üst sınıfta ayarlanmış sabitleri miras almaya çalışıyorum.Inlineiting Sabit satır içi satır içi paketleri
#!/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__
hatadır:
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.
Şimdi, biraz araştırma yapmadan göndermek için buraya gelmedik. Bir seçeneğin, Car::Sports
numaralı telefondan use Car qw(WHEELS WINGS)
olduğunu anlıyorum. Ben sınıfları aynı dosyadaki tüm satır içi oldukları için, aşağıdaki hatayı alıyorum bunu yaparsan Ancak:
Can't locate Car.pm in @INC
çeşitli nedenlerle için, ben bir dosyada Paketlerimde tutmak gerekir. Bunun etrafında bir yolu var mı? Sabitler temel olarak sadece subs, normal bir yöntem için aynı doğru olmazken neden onları almak zorundayım?
Son olarak, ben de bunu yapabilirim biliyorum:
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;
}
Ve gayet ... Ama sınıfların bir dizi var ve ebeveyn isim zorunda olduğunu sabitlerin miras daha genel yapmak istiyorum sınıf açıkça (ve bazen sadece ana sınıf değil, büyükbaba).
Herhangi bir işaretçi için şimdiden çok teşekkürler!
Alkış
Mükemmel! Bunu gerçekten iyi açıkladın ve bana bir şey öğrettin! – wawawawa
Ayrıca, "Araba :: Spor", "Araba" alt sınıfının "Araba" Sports "Araba" yöntemlerine * erişmesini, ancak * işlevlerinin "& WHEELS" ve "& WINGS" gibi değil * yapmasını sağlar. 'Araba' sınıfına bazı yöntemler ekleyene kadar 'temel qw (Araba)' işlevini kullanmak gereksizdir. – mob