2009-09-04 70 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"); 
相关问题