根据标题,我正在编写一个使用多重继承的笨拙代码,并要求同时调用两个SUPER
函数。有没有办法向Perl指示我想从哪个两个父类中运行该函数?使用$self->SUPER::foo($bar);
仅根据documentation运行@ISA
中的第一个匹配函数。
以下介绍了如何继承类:
[Base Class]
|
----------------------------
| |
[A] [B]
| |
----------------------------
|
[C]
答案 0 :(得分:7)
答案 1 :(得分:1)
有很多选择。
如果总是只有两个候选超类,则可以强制@ISA
在两个方向上搜索,所以
$self->SUPER::method;
{
local @ISA = reverse @ISA;
$self->SUPER::method;
}
或者如果你想做一些更聪明的事情,你可以在运行时构建所有超类的方法的名称:
my ($caller) = (caller(0))[3] =~ /([^:]+)\z/;
for my $super (@ISA) {
my $method = join '::', $super, $caller;
$self->$method if exists &$method;
}
第一行获取当前正在执行的方法的名称,并剥离包名称信息以仅留下裸名称。然后将它附加到@ISA
中的每个包名称,如果它存在,则调用该方法。