2010-02-21 10 views
5

Vorrei sostituire la funzione genitore (Somefunc) in classe figlio, quindi quando chiamo Procedura principale dovrebbe fallire.Come posso eseguire l'override di una funzione della classe genitore con child one in Perl?

È possibile in Perl?

Codice:

package Test; 

use strict; 
use warnings; 

sub Main() 
{ 
    SomeFunc() or die "Somefunc returned 0"; 
} 

sub SomeFunc() 
{ 
    return 1; 
} 

package Test2; 

use strict; 
use warnings; 

our @ISA = ("Test"); 

sub SomeFunc() 
{ 
    return 0; 
} 

package main; 

Test2->Main(); 
+1

Infatti non ho davvero bisogno di altre funzioni OO, come la creazione di oggetti, ecc. Ho solo un sacco di codice base con 1 o 2 semplici procedure da sostituire nelle "classi" figlio. – Miollnyr

risposta

4

Quando si chiama Test2->Main(), il nome del pacchetto viene passato come primo parametro della funzione chiamata. È possibile utilizzare il parametro per indirizzare la funzione corretta.

sub Main 
{ 
    my ($class) = @_; 
    $class->SomeFunc() or die "Somefunc returned 0"; 
} 

In questo esempio, $class sarà "Test2", in modo da chiamare Test2->SomeFunc(). La soluzione migliore sarebbe utilizzare istanze (ad esempio, bless l'oggetto in Test::new, utilizzare $self anziché $class). E ancora meglio sarebbe usare Moose, che risolve un sacco di problemi con la programmazione orientata agli oggetti in Perl.

+0

Grazie, funziona;) – Miollnyr

3

Al fine di eredità a lavorare è necessario chiamare le funzioni come metodi, sia su una classe o di un oggetto, utilizzando l'operatore ->. Sembra che tu abbia capito questo per la tua chiamata a Test2->Main(), ma tutti i metodi devono essere chiamati in questo modo.

package Test; 

use strict; 
use warnings; 

sub Main 
{ 
    my $class = shift; 
    $class->SomeFunc() or die "Somefunc returned 0"; 
} 

sub SomeFunc 
{ 
    return 1; 
} 

package Test2; 

our @ISA = ("Test"); 

sub SomeFunc 
{ 
    return 0; 
} 

package main; 

Test2->Main(); 

Vedi perlboot per una breve introduzione e perltoot per maggiori dettagli.

Inoltre, non mettere i paren dopo i nomi delle subroutine quando li si dichiara - non fa ciò che si pensa.

Problemi correlati