Perl:如何确保从基类中访问时调用重写方法

时间:2015-09-18 18:29:36

标签: perl inheritance method-overriding

我有一个基类,它调用在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代码中创建示例,请原谅明显的错误。

2 个答案:

答案 0 :(得分:3)

问题出在您的构造函数中,但是您没有问题,因此您的代码甚至不会按照您的说法执行操作

你可能写过像

这样的东西
sub new {
    bless {};
}

将空哈希保存到当前包中。相反,您需要从传递给构造函数的第一个参数中获取类名,如此

您还应该避免在词汇标识符中使用大写字母,因为它们是为包名称等全局标识符保留的。如果你必须使用CamelCase,那么至少makeSureTheFirstLetterIsLowerCase。 Perl和Python的标准是使用much_clearer_snake_case

Test.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

答案 1 :(得分:1)

除非你使用该方法名称创建函数,否则

new在perl中没有任何意义。

您需要bless一个对象

您可以直接bless一个对象

my $test = { };
bless $test, "Test2";

或制作一个为你祝福的新方法:

sub new{
    my $class = shift;
    my $test = { };
    bless $test, $class;
}