0

当调用 Parent::call_foo() 时,我希望它始终调用 Parent::foo(),无论 $self 是受祝福的父母还是受祝福的孩子,也不管孩子是否重载了 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;
4

1 回答 1

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()它进行了普通的方法查找,但从父类开始(即,如果父类实际上foo从基类继承了它的方法,它将起作用)。既然你知道它foo存在于 Parent 类中,你可以通过直接调用它来节省方法查找的成本。

于 2013-10-16T19:11:04.830 回答