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;
};
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
J'ai modifié le post avec un exemple de test – Mat0