When invoking a method with SUPER, how can I have my blessed hash (of the derived class) look like its SUPER class?
当调用parent::call_foo()时,我希望它始终调用parent::foo(),不管$self是受祝福的父级还是受祝福的子级,也不管子级是否正在重载foo()。
此代码打印:
1 2 3 4
| parent foo
parent call_foo, parent foo
child foo
child call_foo, parent call_foo, child foo |
但我要打印:(最后一行的父foo)
1 2 3 4
| parent foo
parent call_foo, parent foo
child foo
child call_foo, parent call_foo, parent foo |
-
1 2 3 4 5 6 7 8 9 10 11
| use Parent;
use Child;
my $par = Parent->new();
my $chd = Child->new();
$par->foo();
$par->call_foo();
$chd->foo();
$chd->call_foo(); |
-
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| |
-
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| package Child ;
use base qw(Parent );
sub foo {
print"child foo
";
}
sub call_foo {
my $self = shift;
print"child call_foo,";
$self->SUPER::call_foo();
}
1; |
在父级的call_foo中,只需调用foo作为子例程,而不是方法。这将始终调用父版本。
1 2 3 4 5 6 7
| 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存在于父类中,因此可以通过直接调用它来节省方法查找的成本。
- 方法查找只执行一次(结果被缓存),因此避免$self->Parent::foo()实际上不会保存任何内容。也就是说,我不喜欢硬编码当前的包名,所以我可能会使用foo($self)。
- 我很好奇,为什么我不能用__PACKAGE__::foo()代替硬代码?我可以看到它不编译,但我不明白为什么不允许这样做。不管怎样,我想我将使用$self->Parent::foo(),因为在这段代码中,有些情况下,孩子似乎正在重载"grandorrent"方法,但家长必须始终调用grandorrent版本。
- __PACKAGE__->foo($self);似乎是允许父级从基类继承foo的最佳解决方案,并且从不调用子版本,所有这些都没有在包名称中进行硬编码。