在Perl中使用`use base`和@ISA有什么区别?

时间:2009-09-04 10:00:07

标签: perl oop

我想创建一个扩展DBI的单例类。我应该做这样的事情:

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

或者这个:

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

或其他什么?

不确定'use base'和'isa'之间的区别是什么。

4 个答案:

答案 0 :(得分:8)

@ISA的典型用法是

package Foo;

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

baseparent pragma都会加载请求的类并修改@ISA以包含它:

package Foo;

use base qw/Bar/;

如果您想要多重继承,可以向baseparent提供多个模块:

package Foo;

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

parent编译指示是Perl 5.10.1中的新编译器,但如果你有旧版本的Perl,它可以从CPAN安装。它的创建是因为base pragma由于“累积在其中的残骸”而变得难以维持。你不应该看到两者之间基本用途的差异。

答案 1 :(得分:4)

我认为您应该使用parent pragma而不是base中提到的perldoc base

答案 2 :(得分:3)

来自base的perldoc ...

package Baz;

use base qw( Foo Bar );

基本上等同于

package Baz;

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

就个人而言,我使用base。

答案 3 :(得分:0)

如果要继承父类,则需要加载它并修改@ISA。使用Base时,这两个步骤都会得到解决。 Base为您加载模块并相应地修改@ISA。否则,您需要修改@ISA并自行加载父模块。

以下两者都是等效的:

use base "Parent";

require Parent;
@ISA = ("Parent");