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 包名称。
我正在尝试使用 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 包名称。