在Perl中使用多重继承时,是否有一种方法可以指示使用哪个SUPER函数?

时间:2013-03-14 16:20:17

标签: perl

根据标题,我正在编写一个使用多重继承的笨拙代码,并要求同时调用两个SUPER函数。有没有办法向Perl指示我想从哪个两个父类中运行该函数?使用$self->SUPER::foo($bar);仅根据documentation运行@ISA中的第一个匹配函数。

以下介绍了如何继承类:

          [Base Class]
               |
 ----------------------------
 |                          |
[A]                        [B]
 |                          |
 ----------------------------
               |
              [C]

2 个答案:

答案 0 :(得分:7)

只需指定它:

$self->A::foo($bar)

$self->B::foo($bar)

您可能还想查看mro

答案 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中的每个包名称,如果它存在,则调用该方法。