我有一个基类,它调用 Perl 中的子类中重写的方法。目前,它仍然调用该方法的基类版本,但我希望它调用基类(如果有的话)。这是我的代码的简化版本:
package Test;
use strict;
use warnings;
sub Main
{
my $self = shift;
return $self->SomeFunc();
}
sub SomeFunc
{
my $self = shift;
#...
return 1;
}
package Test2;
use strict;
use warnings;
use base qw(Test);
sub SomeFunc
{
my $self = shift;
#...
return 0;
}
package main;
use Test2;
my $test = new Test2();
print $test->Main();
当我运行这个时,我得到了 1!
PS,抱歉,我不习惯在工作 perl 代码中创建示例,请原谅明显的错误。
最佳答案
问题出在您的构造函数中,但您没有构造函数,因此您的代码甚至没有执行您所说的操作
你可能写过类似的东西
sub new {
bless {};
}
这将空散列祝福到当前包中。相反,您需要从传递给构造函数的第一个参数中获取类名,如下所示
您还应该避免在词法标识符中使用大写字母,因为它们是为全局标识符(例如包名称)保留的。如果必须使用驼峰命名法,那么至少要使用 makeSureTheFirstLetterIsLowerCase。 Perl 和 Python 的标准都是使用 much_clearer_snake_case
测试.pm
package Test;
use strict;
use warnings;
sub new {
my $class = shift;
bless {}, $class;
}
sub main {
my $self = shift;
$self->some_func();
}
sub some_func {
my $self = shift;
'Test::some_func';
}
Test2.pm
package Test2;
use strict;
use warnings;
use parent 'Test';
sub some_func {
my $self = shift;
'Test2::some_func';
}
main.pl
use strict;
use warnings;
my $test = Test->new;
print $test->main, "\n";
$test = Test2->new;
print $test->main, "\n";
输出
Test::some_func
Test2::some_func
关于Perl:如何确保从基类内部访问时调用重写的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32658755/