Если вы намереваетесь, что Coder наследует от Person, вы неправильно его конструируете.Например, в конструкторе Coder вы создаете новый объект Person, а затем выбрасываете его.Это был бы намного лучший (и более стандартный) способ создания объекта Coder, который наследуется от Person (см. perldoc perltoot ):
sub new
{
my $class = shift;
my $this = $class->SUPER::new(shift, shift);
# add on extra fields, now at the head of @_...
bless $this, $class;
return $this;
}
Также можно сделать много улучшений.:
- отсутствует
use strict; use warnings;
лично use parent 'Person';
, а не манипулирует прототипами функций @ ISA - редко - хорошая идея (используйте их, только если вы знаю они вам нужны, и это никогда верно при написании объектно-ориентированного класса, где функции будут вызываться как методы)
- вы можете автоматически генерировать методы доступа и мутаторы с помощью Class :: Accessor , вместо того, чтобы писать много дублирующихся шаблонов
Кроме того, хотя я не уверен, что вы готовы (вы должны понимать основы построения Perl OOво-первых), вы можете пропустить написание почти всего этого кода, используя Moose :
package Person;
use Moose;
has [qw(firstName secondName)] => (
is => 'rw', isa => 'Str',
);
no Moose;
__PACKAGE__->meta->make_immutable;
1;
package Coder;
use Moose;
extends 'Person';
has [qw(language experience)] => (
is => 'rw', isa => 'Str',
);
no Moose;
__PACKAGE__->meta->make_immutable;
1;