2013-09-29 23 views
7

Sto cercando in Perl OO (nuovo in Perl). Ho creato un esempio di gerarchia di banale: classe
principale: classeEsiste una classe derivata effettiva in runtime in 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; 

bambini:

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

cerco di testarlo nel modo seguente:

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


use Objs::Manager; 

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

Risultato:

Tempo: Dom Sep 29 12:56:29 2013

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

Domanda: Perché l'oggetto segnalato nel dump è un Obj :: Employee e non un Obj :: Manager?
Ho chiamato nuovo su un Manager.

+1

Tra l'altro , poiché i metodi 'get_started' e' set_started' sono metodi di istanza (unli ke 'new' che è un metodo di classe), il primo argomento a loro sarà un'istanza della classe, non la classe stessa. Quindi dovresti chiamarlo "$ self" o qualcosa per evitare confusione. –

+0

La variabile del pacchetto $ started in Objs :: Employee non è utilizzata. –

risposta

11

Utilizzare sempre due argomenti per bless, come $class indica in quale pacchetto deve essere benedetto. Se si omette $class, viene utilizzato il pacchetto corrente.

bless $self, $class; 

uscita

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

Da perldoc -f bless:

Utilizzare sempre la versione a due argomenti se una classe derivata potrebbe ereditare la funzione di fare la benedizione

+0

Perchè? Potresti per favore elaborare? – Cratylus

+0

Nel mio esempio la '$ class' è un argomento passato che mi aspetterei di essere Manager dato che ho fatto:' Objs :: Manager-> new'. Quindi il '$ self ', ma di per sé è ciò che ritorna il super costruttore che è un Dipendente e il benedetto lo ritrasmette? – Cratylus

+0

La classe è sempre il primo parametro nel costruttore (metodo statico). Quando viene chiamato dal figlio, viene passata la classe figlio, altrimenti è la classe corrente. Nota che '$ class' all'interno di tuo figlio e genitore sono variabili diverse con valori diversi. –