7

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); 

結果:

時間: 2013 年 9 月 29 日 (日) 12:56:29

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

質問: ダンプでオブジェクトが Obj::Manager ではなく Obj::Employee と報告されるのはなぜですか?
私はマネージャーに新しい電話をかけました。

4

1 に答える 1

11

どのパッケージにオブジェクトを追加するかを指示するためbless、 には常に 2 つの引数を使用します。$classを省略する$classと、現在のパッケージが使用されます。

bless $self, $class; 

出力

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

からperldoc -f bless:

派生クラスが祝福を行う関数を継承する可能性がある場合は、常に引数が 2 つのバージョンを使用します。

于 2013-09-29T11:23:46.847 に答える