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

标签 perl inheritance 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 代码中创建示例,请原谅明显的错误。

最佳答案

问题出在您的构造函数中,但您没有构造函数,因此您的代码甚至没有执行您所说的操作

你可能写过类似的东西

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/

相关文章:

arrays - 如何对数组使用 Perl 的 grep 函数?

perl - 如何在Perl中匹配两个文档之间的字符串顺序?

perl - 为 Web 应用程序使用非系统 perl 的推荐方法是什么?

c# - 刷新 WPF 中子控件的 DataContext

python - 为什么继承 `bitstring.BitArray` 时,子构造函数的第一个参数在父构造函数中使用?

javascript - 子类互相覆盖对方的方法

c# - 为什么当存在不明确的虚拟方法时此 C# 代码编译正常?

perl - perl 如何发送 SMTP 邮件

java - @Override on 子类 "appears"中的方法在运行时被忽略

PHP:将一个类的所有函数包装在一个子类中