在Perl中使用多重继承时,是否有方法指示要使用哪个超级函数?

在Perl中使用多重继承时,是否有方法指示要使用哪个超级函数?,perl,Perl,正如标题所述,我正在编写一段笨拙的代码,它使用多重继承,并要求同时调用这两个超级函数。有没有一种方法可以向Perl指示我要从两个父类中的哪一个运行函数?使用$self->SUPER::foo$bar;仅按照运行@ISA中的第一个匹配函数 下面介绍了类是如何继承的: [Base Class] | ---------------------------- | | [A]

正如标题所述,我正在编写一段笨拙的代码,它使用多重继承,并要求同时调用这两个超级函数。有没有一种方法可以向Perl指示我要从两个父类中的哪一个运行函数?使用$self->SUPER::foo$bar;仅按照运行@ISA中的第一个匹配函数

下面介绍了类是如何继承的:

          [Base Class]
               |
 ----------------------------
 |                          |
[A]                        [B]
 |                          |
 ----------------------------
               |
              [C]
只需指定它:

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

您可能还想查看。

只需指定它:

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


您还可以查看。

有许多选项

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

有许多选项

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

当我看到这一点时,我认为这是我已经尝试过的,结果证明我已经尝试过了,但我也没有完全解决问题,即$self->A::foo与$self->package::A::foo,事实证明,我有,但我也没有完全解决问题,即$self->A::foo与$self->Package::A::foo。如果我必须保持这一点,我宁愿认为我会颤抖成一个小球,就像有人往上面倒盐一样我相信我终于了解了当地的情况。@tchrist:这是我所能理解的。当然问题在于需求而不是解决方案?我的问题不在于易读性,而在于欺骗@ISA的概念。该局部是动态作用域,因此在调用另一个超级时,它仍将被翻转。我更喜欢use mro中的next::method等内容,尤其是与,甚至是use next中的EVERY::foo vs EVERY::LAST::foo。如果你在左右摇摆,或者是广度与深度的对比,请仔细考虑是否有一种比在动态范围内破解@ISA更为成熟和可维护的方式来实现你的真正目标,因为这会产生可怕的副作用。伊斯特的回答很好。@tchrist:谢谢。那很有用。我真的不熟悉mro,但它真的应该在我的工具箱中,尽管它是一个核心模块,但我甚至不知道下一个模块。如果我必须保持它,我宁愿认为我会颤抖成一个小球,就像有人往上面倒盐一样我相信我终于了解了当地的情况。@tchrist:这是我所能理解的。当然问题在于需求而不是解决方案?我的问题不在于易读性,而在于欺骗@ISA的概念。该局部是动态作用域,因此在调用另一个超级时,它仍将被翻转。我更喜欢use mro中的next::method等内容,尤其是与,甚至是use next中的EVERY::foo vs EVERY::LAST::foo。如果你在左右摇摆,或者是广度与深度的对比,请仔细考虑是否有一种比在动态范围内破解@ISA更为成熟和可维护的方式来实现你的真正目标,因为这会产生可怕的副作用。伊斯特的回答很好。@tchrist:谢谢。那很有用。我真的不熟悉mro,但它真的应该在我的工具箱中,我甚至不知道NEXT,尽管它是一个核心模块。