我正在尝试使用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;
};
答案 0 :(得分:3)
您正在将_sortAlgorithm
作为函数在AbstractSort`中的同一个包中调用,而不是作为方法。
sub sortData {
my $self = shift;
# there is something missing here!
_sortAlgorithm( $self->array );
}
这样,它将始终在同一个包中调用,因为它不是OOP方法调用。
您需要改为$self->_sortAlgorithm
。
sub sortData {
my $self = shift;
print "Sorting data..\n";
$self->_sortAlgorithm( $self->array );
# ...
}
现在不再die
了,因为它会在_sortAlgorithm
上查找$self
方法,这是您子类的一个实例。
事实上,你在被覆盖的方法上实际拥有my $self = shift
可能会让你失望,因为你还没有将$self
传递给它。
你也不应该绕过$self->array
。算法方法也可以访问$self->array
,因此如果要对附加到对象的数据进行排序,只需直接在其中使用即可。
另请注意,Perl中的典型命名约定建议使用snake_case方法和变量名称以及CamelCase包名称。