2013-03-14 56 views
1

根據標題,我正在研究一些使用多重繼承的代碼,並要求調用兩個SUPER函數。有什麼方法可以向Perl指出我想從哪個父類運行該函數?使用$self->SUPER::foo($bar);僅按照documentation運行@ISA中的第一個匹配功能。在Perl中使用多繼承時,是否有一種方法可以指示要使用哪個SUPER函數?

下面給出的類是如何繼承一個想法:

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

回答

7

只需指定:

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

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

您可能也想看看mro

+3

+1爲mro,它只是爲了這個目的。 – 2013-03-14 16:46:49

+0

當我看到這個,我認爲這是我已經嘗試過的東西,事實證明我有,但我也沒有完全解決的東西,即'$ self-> A :: foo()'與'$ self - >套票:A :: foo的()'。 – rjzii 2013-03-14 17:11:29

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中的每個包名稱,如果該方法存在,則調用該方法。

+3

如果我必須保持這一點,我寧願認爲我會像一個浸出鹽的浸出物一樣轉入一個小球。 :) – tchrist 2013-03-14 21:02:46

+1

我相信我終於明白'本地'。 – 2017-07-13 15:04:31

+0

@tchrist:它的可讀性盡我所能。問題肯定是要求而不是解決方案? – Borodin 2017-07-13 15:13:12

相關問題