【发布时间】:2017-08-14 08:43:21
【问题描述】:
我正在尝试使用 Perl 和 Moose 创建抽象方法模式。我不明白的是,如果我重写 AbstractClass 中的方法,它最终还是会被调用。为什么会这样?有没有办法避免调用超类?
主要
package main;
use AbstractSort;
use OrderedSort;
# Sub class test
my $ordered = OrderedSort->new(array => [1, -1, 23, 34123, -24324]);
$ordered->sortData();
抽象类
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;
};
【问题讨论】:
-
你确定吗?请出示minimal reproducible example。如果我将包添加到您的代码中,它对我有用。没看到
die,先调用before处理程序。 -
我已经用一个测试示例编辑了帖子
标签: perl perl-module moose