Наследование констант встроенными пакетами

ХОРОШО. У меня проблема при попытке наследования констант, установленных в родительском классе для любого из дочерних классов.

#!/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.

Теперь я не пришел сюда, чтобы опубликовать, не проведя никаких исследований. Я понимаю, что одним из вариантов было бы использование Car qw (WHEELS WINGS) в Автомобиль:: Спорт . Однако, если я сделаю это, я получу следующую ошибку, потому что все классы встроены в один файл:

Can't locate Car.pm in @INC 

По разным причинам, мне нужно сохранить свои пакеты в одном файле. Есть ли способ обойти это? Поскольку константы в основном просто подводы, почему я должен импортировать их, когда то же самое не будет верно для нормального метода?

Наконец, я также знаю, что я могу сделать это:

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;
}

И это нормально... Но у меня есть несколько классов и я хочу сделать наследование констант более родовым, что нужно назвать родительский класс явно (и иногда это не только родительский класс, но бабушка и дедушка).

Заранее большое спасибо за любые указатели!

Ура

-121--1774073- Первый день недели клиента Можно ли определить региональные настройки машины клиента, используя чистый javascript? Мне нужно получить первый день недели. Это воскресенье или понедельник.

Можно ли определить региональные настройки машины клиента, используя чистый javascript? Мне нужно получить первый день недели. Это воскресенье или понедельник.

11
задан iLemming 19 September 2011 в 16:17
поделиться