当调用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;
答案 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
,你可以直接调用它来节省方法查找的成本。