2017-08-14 3 views
2

J'essaie de créer le modèle de méthode abstraite en utilisant Perl et Moose. Ce que je ne comprends pas, c'est que si je remplace une méthode de AbstractClass il sera finalement appelé de toute façon. Pourquoi est-ce et est-il un moyen d'éviter l'appel de la superclasse?Perl - Avec la méthode surchargée, éviter super() est appelé

principal

package main; 
use AbstractSort; 
use OrderedSort; 

# Sub class test 
my $ordered = OrderedSort->new(array => [1, -1, 23, 34123, -24324]); 
$ordered->sortData(); 

AbstractClass

package AbstractSort; 
use namespace::autoclean; # Trims EXPORTER 
use Moose; 

has 'array' => (traits => ['Array'], 
      is => 'ro', 
      isa => 'ArrayRef[Int]', 
      default => sub { [] }, 
      handles => {  
       get_array => 'get', 
       count_array => 'count', 
      }); 

sub sortData{ 
    my $self = shift; 

    print "Sorting data..\n"; 

    _sortAlgorithm($self->array); 

    # ... 
} 

# Protected method here is the actual algorithm 
sub _sortAlgorithm { 
    die 'You must override _sortAlgorithm() in a subclass'; 
    # but Moose will always call the superclass which then makes it die 
} 

SubClass

package OrderedSort; 
use namespace::autoclean; # Trims EXPORTER 
use Moose; 
extends 'AbstractSort'; 

# Override and mmpl _sortAlgorithm 
override _sortAlgorithm => sub { 
    my $self = shift; 
    # .... 
}; 

before '_sortAlgorithm' => sub { 
    my $self = shift; 
    # ... 

    return; 
}; 
+0

Etes-vous sûr? S'il vous plaît montrer un [mcve]. Si j'ajoute des paquets à votre code cela fonctionne pour moi. Je ne le vois pas mourir, et le gestionnaire 'before 'est appelé en premier. – simbabque

+0

J'ai modifié le post avec un exemple de test – Mat0

Répondre

3

Vous appelez _sortAlgorithm comme une fonction dans le même paquet dans AbstractSort`, et non comme une méthode. Ainsi, il sera toujours appelé dans le même paquet, car il ne s'agit pas d'un appel de méthode OOP. Vous devez faire $self->_sortAlgorithm à la place.

sub sortData { 
    my $self = shift; 

    print "Sorting data..\n"; 

    $self->_sortAlgorithm($self->array); 

    # ... 
} 

Il va maintenant ne die plus, car il recherche la méthode _sortAlgorithm sur $self, qui est une instance de votre sous-classe. Le fait que vous ayez effectivement my $self = shift sur votre méthode surchargée aurait pu donner cela, car vous n'y avez pas non plus passé .


Vous ne devriez pas être de passage autour $self->array. La méthode de l'algorithme a également accès à $self->array, donc si vous voulez trier les données qui sont attachées à votre objet, il suffit de l'utiliser directement.

Notez également que les conventions de nommage typiques en Perl suggèrent la méthode snake_case et les noms de variables, ainsi que les noms de paquetage CamelCase.