2010-02-21 3 views
5

Je voudrais remplacer la fonction parent (Somefunc) dans la classe enfant, donc quand j'appelle la procédure Main, elle devrait échouer.Comment remplacer une fonction de classe parente par une fonction enfant en Perl?

Est-ce possible en Perl?

code:

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

En fait, je n'ai vraiment pas besoin d'autres fonctionnalités OO, comme la création d'objets, etc. J'ai juste beaucoup de code de base avec 1 ou 2 procédures simples à remplacer dans les 'classes' enfants. – Miollnyr

Répondre

4

Lorsque vous appelez Test2->Main(), le nom du package est transmis en tant que premier paramètre à la fonction appelée. Vous pouvez utiliser le paramètre pour adresser la bonne fonction.

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

Dans cet exemple, $class sera "Test2", vous appellera Test2->SomeFunc(). Une solution encore meilleure serait d'utiliser des instances (c'est-à-dire, bless l'objet dans Test::new, utilisez $self au lieu de $class). Et encore mieux serait d'utiliser Moose, ce qui résout beaucoup de problèmes avec la programmation orientée objet en Perl.

+0

Merci, ça marche;) – Miollnyr

3

Pour héritage au travail vous devez appeler vos fonctions en tant que méthodes, soit sur une classe ou d'un objet, en utilisant l'opérateur ->. Vous semblez avoir compris cela pour votre appel à Test2->Main(), mais toutes les méthodes que vous voulez vous comporter d'une manière OO doivent être appelées de cette façon.

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

Voir perlboot pour une introduction en douceur et perltoot pour plus de détails.

De même, ne mettez pas les parens après vos noms de sous-programmes lorsque vous les déclarez - cela ne fait pas ce que vous pensez.

Questions connexes