Я пытаюсь изучить наследование в Perl.perl наследование и структура каталогов
Это моя структура каталогов:
perldir
perldir \ child.pl
perldir \ MYLIB
perldir \ MYLIB \ Parent.pm
Parent.pm
package Parent;
sub new {
my $class = shift;
my $self = { _first => shift, _last => shift };
bless $self, $class;
}
sub getFirstName {
my ($self) = @_;
return $self->{ _first };
}
1;
child.pl
package Child;
use parent 'Mylib::Parent';
sub new {
my $class = shift;
my $self = Parent->new(shift, shift);
bless $self, $class;
}
my $obj = new Child('Jack', 'Sparrow');
print $obj->{_first},' ',$obj->{_last};
print "\n",$obj->getFirstName(); #Error
Ошибка, наложенная на последнюю строку: Не удается найти метод объекта «getFirstName» через пакет «AChild» в строке child.pl 13;
Программа работает, если я выполняю одно из следующих действий:
1. У меня есть оба файла в каталоге Mylib.
2. заменяет
use parent 'Mylib::Parent'
с
use Mylib::Parent;
@ISA = ('Parent');
Можно ли получить программу для работы с помощью «использовать родитель» и с классом ребенка в другом каталоге?
==========================
ОБНОВЛЕНО вопрос основанный на ответ choroba «s.
Ok я изменил классы, чтобы отразить следующее:
Parent.pm
package Mylib::Parent;
sub new {
my $class = shift;
my $self = { _first => shift, _last => shift };
bless $self, $class;
}
sub getFirstName {
my ($self) = @_;
return $self->{ _first };
}
1;
child.pl
package Child;
use parent 'Mylib::Parent';
sub new {
my $class = shift;
my $self = Mylib::Parent->new(shift, shift);
bless $self, $class;
}
my $obj = new Child('Jack', 'Sparrow');
print $obj->{_first},' ',$obj->{_last};
print "\n",$obj->getFirstName();
выше работает отлично. Теперь рассмотрим, что я хочу, чтобы другой дочерний класс находился в том же каталоге, что и Parent.pm.
perldir \ MYLIB \ ChildTwo.pl
package ChildTwo; #or package Mylib::ChildTwo;
use parent 'Mylib::Parent'; #or use parent 'Parent';
sub new {
my $class = shift;
my $self = Mylib::Parent->new(shift, shift); #or Parent->new(shift, shift);
bless $self, $class;
}
my $obj = new ChildTwo('Jack', 'Sparrow'); #or new Mylib::ChildTwo('Jack','Sparrow');
print $obj->{_first},' ',$obj->{_last};
print "\n",$obj->getFirstName();
1;
выше не работает. Могу ли я заставить ChildTwo.pl работать вместе с Child.pl без использования 'use lib'?
'Parent' ne 'AParent'. – choroba
Если это дочерний класс, он должен перейти к файлу pm, а не к pl. – choroba
Я понимаю соглашения. Я пытаюсь понять, как заставить оба .pl работать с тем же Parent.pm – raka