Есть ли в Perl фактический производный класс во время выполнения?
Я смотрю в Perl OO (новичок в Perl). Я создал тривиальный пример иерархии:
Родительский класс:
#!usr/bin/perl
use strict;
use warnings;
package Objs::Employee;
my $started;
sub new {
my ($class) = @_;
my $cur_time = localtime;
my $self = {
started => $cur_time,
};
print "Time: $cur_time \n";
bless $self;
}
sub get_started {
my ($class) = @_;
return $class->{started};
}
sub set_started {
my ($class, $value) = @_;
$class->{started} = $value;
}
1;
Детский класс:
#!/usr/bin/perl
package Objs::Manager;
use strict;
use warnings;
use base qw (Objs::Employee);
my $full_name;
sub new {
my ($class, $name) = @_;
my $self = $class->SUPER::new();
$self->{full_name} = $name;
return $self;
}
1;
Я пытаюсь проверить это следующим образом:
#!/usr/bin/perl
use strict;
use warnings;
use Objs::Manager;
my $emp = Objs::Manager->new('John Smith');
use Data::Dumper;
print Dumper($emp);
Результат:
Время: вс 29 сентября 12:56:29 2013
$VAR1 = bless( {
'started' => 'Sun Sep 29 12:56:29 2013',
'full_name' => 'John Smith'
}, 'Objs::Employee' );
Вопрос: Почему объект, указанный в дампе, является Obj:: Employee, а не Obj:: Manager?
Я позвонил новым на менеджера.
1 ответ
Решение
Всегда используйте два аргумента для bless
, как $class
говорит, в какой пакет должен быть благословлен объект. Если $class
опущен, текущий пакет используется.
bless $self, $class;
выход
$VAR1 = bless( {
'started' => 'Sun Sep 29 13:24:26 2013',
'full_name' => 'John Smith'
}, 'Objs::Manager' );
От perldoc -f bless
:
Всегда используйте версию с двумя аргументами, если производный класс может наследовать функцию, выполняющую благословение