1

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

下面给出了如何继承类的概念:

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

2 回答 2

8

只需指定它:

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

或者

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

您可能还想查看mro

于 2013-03-14T16:32:34.413 回答
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,如果存在则调用该方法。

于 2013-03-14T16:57:55.047 回答