2013-09-29 11 views
7

私はPerl OO(Perlの初心者)を探しています。
親クラス:実行時に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); 

結果:

時間:Sun Sep 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

を行う機能を継承する可能性がある場合は、必ず2引数バージョンを使用メソッド 'get_started'と' set_started'はインスタンスメソッドです(unliクラスメソッドである '' new')では、それらの最初の引数はクラス自体ではなくクラスのインスタンスになります。ですから、混乱を避けるために '$ self'などと呼ぶべきです。 –

+0

Objs :: Employeeの$ startedパッケージ変数は使用されていません。 –

答えて

11

blessには常に2つの引数を使用します。$classは、どのパッケージが祝福されるべきかを指示します。 $classを省略すると、現在のパッケージが使用されます。 perldoc -f blessから

bless $self, $class; 

出力

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

派生クラスがちなみに祝福に

+0

なぜですか?詳しく教えてください。 – Cratylus

+0

私の例では、 '$ class'は、渡された引数です。これは、Objs :: Manager-> new'でした。したがって、 '$ self'自体はスーパーコンストラクタが返すEmployeeであり、祝福はそれを打ちのめすものです。 – Cratylus

+0

クラスは常にコンストラクタ(静的メソッド)の最初のパラメータです。子から呼び出されると、子クラスが渡されます。そうでなければ、現在のクラスです。あなたの子と親の中の '$ class'は異なる値を持つ異なる変数です。 –

関連する問題