在Perl中是否有运行时的实际派生类?

Cra*_*lus 7 oop perl perl-module activestate

我正在研究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;  
Run Code Online (Sandbox Code Playgroud)

儿童班:

#!/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;  
Run Code Online (Sandbox Code Playgroud)

我尝试按如下方式测试它:

#!/usr/bin/perl  
use strict;  
use warnings;  


use Objs::Manager;  

my $emp = Objs::Manager->new('John Smith');  
use Data::Dumper;  
print Dumper($emp); 
Run Code Online (Sandbox Code Playgroud)

结果:

时间:2013年9月29日星期日12:56:29

$VAR1 = bless( {
                 'started' => 'Sun Sep 29 12:56:29 2013',
                 'full_name' => 'John Smith'
               }, 'Objs::Employee' );
Run Code Online (Sandbox Code Playgroud)

问题:为什么转储中的对象报告的是Obj :: Employee而不是Obj :: Manager?
我打电话给经理.

Сух*_*й27 11

总是使用两个参数bless,作为$class告诉哪个包应该被祝福.如果$class省略,则使用当前包.

bless $self, $class; 
Run Code Online (Sandbox Code Playgroud)

产量

$VAR1 = bless( {
             'started' => 'Sun Sep 29 13:24:26 2013',
             'full_name' => 'John Smith'
           }, 'Objs::Manager' );
Run Code Online (Sandbox Code Playgroud)

来自perldoc -f bless:

如果派生类可能继承执行祝福的函数,则始终使用双参数版本

  • 即使`$ class`在调用`Objs :: Employee-> new`(我没有争议)中是`Objs :: Manager`,这也是一个没有实际意义的因为你还没有使用`$ class` .但是因为你没有使用第二个参数来"祝福",它默认为当前包,它由`package Objs :: Employee;`行设置. (2认同)