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

Perl - With overriden method avoid super() is called

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

您正在调用 _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,因为它查找 $self 上的 _sortAlgorithm 方法,它是您的子类的一个实例。

事实上,您在重写的方法上有 my $self = shift 的事实可能已经暴露了这一点,因为您也没有将 $self 传递给它。


你也不应该四处走动 $self->array。 algorithm 方法也可以访问 $self->array,所以如果你想对附加到你的对象的数据进行排序,直接在里面使用它就可以了。

另请注意,Perl 中的典型命名约定建议使用 snake_case 方法和变量名称,以及 CamelCase 包名称。