我有一个基类,它调用在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代码中创建示例,请原谅明显的错误。
答案 0 :(得分:3)
问题出在您的构造函数中,但是您没有问题,因此您的代码甚至不会按照您的说法执行操作
你可能写过像
这样的东西sub new {
bless {};
}
将空哈希保存到当前包中。相反,您需要从传递给构造函数的第一个参数中获取类名,如此
您还应该避免在词汇标识符中使用大写字母,因为它们是为包名称等全局标识符保留的。如果你必须使用CamelCase,那么至少makeSureTheFirstLetterIsLowerCase。 Perl和Python的标准是使用much_clearer_snake_case
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';
}
package Test2;
use strict;
use warnings;
use parent 'Test';
sub some_func {
my $self = shift;
'Test2::some_func';
}
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
答案 1 :(得分:1)
new
在perl中没有任何意义。
您需要bless
一个对象
您可以直接bless
一个对象
my $test = { };
bless $test, "Test2";
或制作一个为你祝福的新方法:
sub new{
my $class = shift;
my $test = { };
bless $test, $class;
}