2012-11-10 18 views
-1

下面是一個最小化的示例,其中,I有OA.pm(父對象),OB.pm子對象,和轉輪腳本:SUPER是未定義的,當我有多重繼承

對象OB:

package OB; 

use OA; 
require Exporter; 
@ISA = (Exporter, OA); 
@EXPORT =(); 

sub new { 
    my $class = shift; 

    print $class->SUPER; 
    bless {}, $class; 
}; 

1; 

對象OA:

package OA; 

require Exporter; 
@ISA = (Exporter); 
@EXPORT =(); 

sub new { 
    bless {}, shift; 
}; 

1; 

和流道:

#!/usr/bin/perl 

use strict; 
use warnings; 
use OB; 

print OB->new; 

當我運行它,我得到:

Can't locate object method "SUPER" via package "OB" at OB.pm line 10.

1)什麼可能是錯誤的?

2)如果我有多個家長,SUPER會指出什麼?

3)是use OA強制性的?

+0

請注意,您不需要從Exporter繼承。你只需要'使用Exporter qw(import);' – ikegami

回答

3

與Ruby不同,您必須明確說明您所指的整個方法。

print $class->SUPER::new; 

這是假設你想調用該方法。如果你的意圖是弄清楚什麼父類包含新方法,那很複雜,我將跳過解釋如何在這裏。

如果你的類有多個父類,多重繼承,Perl通常會通過父類深度優先查找匹配方法。這通常是有問題的,您可以使用use mro "c3"切換到C3 method resolution order (mro),這樣可以避免diamond inheritance problem

More information on how SUPER and multiple inheritance

最後,use OArequire OA對於加載OA類是強制性的。您可以使用use parent "OA"從一行中的類加載和繼承。

+0

嗨,我剛剛更新了我的問題,我將它分成三部分,你能檢查它嗎? (第二和第三個) – daisy

+0

知道並更新了。你打算從'print $ class-> SUPER'得到什麼? – Schwern

+0

沒什麼,我試圖創建一個真正最小化的例子...因爲perl通常只是打印它的內存地址,只是爲了看看它是否工作 – daisy