如何在Perl中覆盖子类1的父类函数?

时间:2010-02-21 09:00:12

标签: perl inheritance override

我想在子类中替换父函数(Somefunc),所以当我调用Main过程时它应该失败。

Perl有可能吗?

代码:

package Test;

use strict;
use warnings;

sub Main()
{
    SomeFunc() or die "Somefunc returned 0";
}

sub SomeFunc()
{
    return 1;
}

package Test2;

use strict;
use warnings;

our @ISA = ("Test");

sub SomeFunc()
{
    return 0;
}

package main;

Test2->Main();

2 个答案:

答案 0 :(得分:4)

当您调用Test2->Main()时,包名称将作为第一个参数传递给被调用函数。您可以使用该参数来解决正确的功能。

sub Main
{
    my ($class) = @_;
    $class->SomeFunc() or die "Somefunc returned 0";
}

在此示例中,$class将为"Test2",因此您将致电Test2->SomeFunc()。更好的解决方案是使用实例(即bless Test::new中的对象,使用$self代替$class)。更好的是使用Moose,这解决了Perl中面向对象编程的许多问题。

答案 1 :(得分:3)

为了继承工作,您需要使用->运算符将您的函数作为方法调用,无论是在类还是对象上。您似乎已经想到了对Test2->Main()的调用,但是您希望以OO方式执行的所有方法必须以这种方式调用。

package Test;

use strict;
use warnings;

sub Main
{
    my $class = shift;
    $class->SomeFunc() or die "Somefunc returned 0";
}

sub SomeFunc
{
    return 1;
}

package Test2;

our @ISA = ("Test");

sub SomeFunc
{
    return 0;
}

package main;

Test2->Main();

有关详细介绍,请参阅perlboot,有关详情,请参阅perltoot

此外,在声明子例程名称时,请不要将子句放在子例程名称之后 - 它不符合您的想法。