2009-09-04 148 views
9

我想做一個擴展DBI的單例類。我應該做這樣的事情:在Perl中`use base`和@ISA有什麼區別?

use base 'Class::Singleton'; 
our @ISA = ('DBI');

或本:

our @ISA = ('Class::Singleton', 'DBI');

或其他什麼東西?

不確定'use base'和'isa'之間的區別是什麼。

+2

好了,base.pm文檔告訴你的差異。 – 2009-09-04 16:33:53

回答

4

我想你應該使用parent編譯指示而不是base,正如perldoc base中所建議的那樣。

+1

5.10是'父'嗎?它必須是,因爲它不在我的5.8文檔中。 – Ether 2009-09-04 16:56:47

+0

我不確定。然而,引用Chas的聲明:「... Perl 5.10.1的父編譯器是新的,但如果您有舊版Perl,則可以從CPAN安裝...」 – 2009-09-04 17:11:41

8

的典型用途@ISA

package Foo; 

require Bar; 
our @ISA = qw/Bar/; 

baseparent編譯指示都加載所請求的類,並修改@ISA包括它:

package Foo; 

use base qw/Bar/; 

如果你想多繼承,您可以提供多於一個模塊至baseparent

package Foo; 

use parent qw/Bar Baz/; #@ISA is now ("Bar", "Baz"); 

parent pragma是Perl 5.10.1中的新增功能,但如果您有較舊版本的Perl,則可以從CPAN安裝。它的創建是因爲base編譯指示由於「積累在其中的殘留物」而難以維護。你不應該在兩者之間的基本用途上看到不同。

3

從底座的的perldoc ...

package Baz; 

use base qw(Foo Bar); 

基本上等同於

package Baz; 

BEGIN { 
    require Foo; 
    require Bar; 
    push @ISA, qw(Foo Bar); 
} 

就個人而言,我使用基地。

+1

最新的base.pm告訴人們使用5.10.1中的父親。 :) – 2009-09-04 16:32:57

0

如果你想繼承父類,那麼你需要加載它並修改@ISA。當您使用Base時,這兩個步驟都會照顧到。 Base會爲您加載模塊並相應地修改@ISA。否則,您需要修改@ISA並自行加載父模塊。

下面的兩個是等價的:

use base "Parent"; 

require Parent; 
@ISA = ("Parent"); 
相關問題