2013-09-29 18 views
7

Ich untersuche Perl OO (neu in Perl). Ich habe ein triviales Beispiel Hierarchie:
Übergeordnete Klasse:Gibt es zur Laufzeit in Perl eine tatsächlich abgeleitete Klasse?

#!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; 

Kinderklasse:

#!/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; 

ich versuche, es zu testen, wie folgt:

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


use Objs::Manager; 

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

Ergebnis:

Zeit: So Sep 29 12:56:29 2013

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

Frage: Warum wird das Objekt im Dump ein Obj :: Mitarbeiter und nicht ein Obj :: Manager gemeldet?
Ich rief neu auf einem Manager.

+1

Durch die Art und Weise erben , da die Methoden 'get_started' und' set_started' Instanzmethoden sind (unli ke 'new', was eine Klassenmethode ist, ist das erste Argument für sie eine Instanz der Klasse, nicht die Klasse selbst. Du solltest es also '$ self' nennen oder etwas, um Verwirrung zu vermeiden. –

+0

Die $ gestartete Paketvariable in Objs :: Employee wird nicht verwendet. –

Antwort

11

Verwenden Sie immer zwei Argumente für bless, da $class sagt, in welches Paket Objekt gesegnet werden soll. Wenn $class weggelassen wird, wird das aktuelle Paket verwendet.

bless $self, $class; 

Ausgang

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

Von perldoc -f bless:

Verwenden Sie immer die zweiargumentigen Version, wenn eine abgeleitete Klasse kann die Funktion tun den Segen

+0

Warum könnten Sie bitte etwas ausarbeiten? – Cratylus

+0

In meinem Beispiel ist die '$ class' ein übergebenes Argument, das ich als Manager erwarten würde:' Objs :: Manager-> new'. Also ist das "$ self" aber selbst das, was der Superkonstrukteur zurückgibt, der ein Angestellter ist und der Segen ihn herabsetzt? – Cratylus

+0

Klasse ist immer der erste Parameter im Konstruktor (statische Methode). Wenn von Child aufgerufen, dann wird die Child-Klasse übergeben, andernfalls ist sie die aktuelle Klasse. Beachten Sie, dass '$ class' in Ihrem Kind und Eltern verschiedene Variablen mit unterschiedlichen Werten sind. –