Perl - 使用overriden方法避免调用super()

时间:2017-08-14 08:43:21

标签: perl perl-module moose

我正在尝试使用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;
};

1 个答案:

答案 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包名称。