Вы не установили отношения IS_A между родительским и дочерним классами.
Вы можете сделать это с прагмой base
, как предлагает Иван, или вы можете манипулировать массивом @ISA
. Или вы можете использовать parent
прагму.
@ ISA:
package SubClass;
our @ISA = qw( BaseClass );
package SubClass;
use parent qw( BaseClass );
Кстати, никогда не используйте косвенный синтаксис объекта. Для вызова вашего конструктора выполните:
my $ foo = SubClass-> new ();
Кроме того, похоже, что вы не используете строгие и предупреждения прагмы. Сделай так. Всегда.
Наконец, если у вас есть несколько пакетов в одном файле, полезно заключить каждый пакет в блок.
Ознакомьтесь с perlboot и perltoot , это удобные руководства по ООП в perldoc.
Обновление:
Я только что заметил, что ваши вызовы методов прерываются. Вам нужно найти вызывающий класс или экземпляр в каждом методе.
package BaseClass;
sub new { bless {}, shift; } # horrible constructor - do not reuse.
sub abstract { die "The present situation is abstract"; }
sub method { my $self = shift; $self->abstract; }
package SubClass;
our @ISA = qw( BaseClass );
sub abstract { print "It's alive\n" );
В сценарии:
my $obj = SubClass->new;
$obj->method;
my $base = BaseClass->new;
$base->method;
Обязательно прочитайте учебники, на которые я ссылался. Они вам помогут.