私はPerlとMooseを使って抽象メソッドパターンを作成しようとしています。私が理解していないことは、AbstractClassからメソッドをオーバーライドすると、結局呼び出されることになります。なぜこれがあり、スーパークラスが呼び出されないようにする方法がありますか?Perl - オーバーライドされたメソッドを避けるsuper()が呼び出される
メイン
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
}
サブクラス
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;
};
本当ですか? [mcve]を表示してください。あなたのコードにパッケージを追加すると、それは私のために働く。私はそれが 'die'とは見えず、' before'ハンドラが最初に呼び出されます。 – simbabque
私はテストの例で投稿を編集しました – Mat0