在使用SUPER调用方法时,如何将我的blessed哈希(派生类)看起来像SUPER类?

时间:2013-10-16 18:57:39

标签: perl inheritance

当调用Parent :: call_foo()时,我希望它始终调用Parent :: foo(),无论$ self是一个受祝福的Parent还是一个受祝福的Child,并且不管Child是否正在重载foo( )。

此代码打印:

parent foo
parent call_foo, parent foo
child foo
child call_foo, parent call_foo, child foo

但是我想要打印:(最后一行的父foo)

parent foo
parent call_foo, parent foo
child foo
child call_foo, parent call_foo, parent foo

-

use Parent;
use Child;

my $par = Parent->new();
my $chd = Child->new();

$par->foo();
$par->call_foo();

$chd->foo();
$chd->call_foo();

-

package Parent;

sub new {
    my $class = shift;
    return bless( {}, $class );
}

sub foo {
    print "parent foo\n";
}

sub call_foo {
    my $self = shift;
    print "parent call_foo, ";
    $self->foo();
}
1;

-

package Child;
use base qw(Parent);

sub foo {
    print "child foo\n";
}

sub call_foo {
    my $self = shift;
    print "child call_foo, ";
    $self->SUPER::call_foo();
}
1;

1 个答案:

答案 0 :(得分:1)

在Parent call_foo中,只需将foo作为子例程而不是方法调用。这将始终调用父版本。

package Parent;
...
sub call_foo {
    my $self = shift;
    print "parent call_foo, ";
    foo($self); # always calls Parent::foo
}

您也可以使用$self->Parent::foo()代替foo($self)。不同之处在于$self->Parent::foo()执行常规方法查找,但是从Parent类开始(即,如果Parent实际从基类继承其foo方法,它将起作用)。既然你知道Parent类中存在foo,你可以直接调用它来节省方法查找的成本。