OK. Tôi có một vấn đề cố gắng kế thừa các hằng số được đặt trong một lớp cha cho bất kỳ lớp con nào.Thừa kế các hằng số với gói nội tuyến
#!/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ỗi này là:
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.
Bây giờ, tôi đã không đến đây để gửi mà không làm một số nghiên cứu. Tôi hiểu rằng một tùy chọn sẽ là use Car qw(WHEELS WINGS)
trong Car::Sports
. Tuy nhiên, nếu tôi làm như vậy tôi nhận được lỗi sau, bởi vì các lớp đều là nội tuyến trong cùng một tệp:
Can't locate Car.pm in @INC
Vì nhiều lý do, tôi cần giữ gói của mình trong một tệp. Có cách nào để giái quyết vấn đề này không? Như hằng số về cơ bản chỉ là subs, tại sao tôi phải nhập chúng khi như vậy sẽ không đúng cho một phương pháp bình thường?
Cuối cùng, tôi cũng biết tôi có thể làm điều này:
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;
}
Và nó là tốt ... Nhưng tôi có một số lớp học và muốn làm cho thừa kế của các hằng số chung chung hơn là phải đặt tên cho cha mẹ lớp một cách rõ ràng (và đôi khi nó không chỉ là lớp cha, mà là ông bà).
Rất cám ơn trước cho bất kỳ con trỏ nào!
Cheers
Hoàn hảo! Bạn đã thực sự giải thích điều này tốt và dạy tôi điều gì đó! – wawawawa
Ngoài ra, làm cho 'Xe :: Thể thao' một phân lớp của' Xe' sẽ cung cấp cho 'Xe :: Thể thao' truy cập vào phương pháp' Xe '*, nhưng không phải * chức năng của nó * như' & WHEELS' và '& WINGS'. Việc gọi 'use base qw (Car)' là thừa cho đến khi bạn thêm một số phương thức vào lớp 'Car'. – mob