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

x33g5p2x  于 2023-08-06  发布在  Perl
关注(0)|答案(2)|浏览(94)

正如标题所示,我正在编写一段笨拙的代码,它使用了多重继承,并要求同时调用两个SUPER函数。有没有一种方法可以向Perl指明我想从两个父类中的哪一个运行函数?使用$self->SUPER::foo($bar);只运行@ISA中的第一个匹配函数。
下面给出了如何继承类的想法:

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

字符串

kg7wmglp

kg7wmglp1#

只需指定它:

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

字符串
或者是

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


您可能还想查看mro

flvlnr44

flvlnr442#

有许多选择。
如果总是只有两个候选超类,则可以强制在两个方向上搜索@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中的每个包名,如果存在,则调用该方法。

相关问题