代码之家  ›  专栏  ›  技术社区  ›  aidan

Perl中的'use base'和@ISA有什么区别?

  •  9
  • aidan  · 技术社区  · 15 年前

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

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

    或者这个:

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

    或者别的什么?

    不太清楚“use base”和“isa”之间的区别。

    4 回复  |  直到 8 年前
        1
  •  8
  •   Chas. Owens    15 年前

    的典型用法 @ISA

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

    这个 base parent pragmas同时加载请求的类和modify @伊萨 包括:

    package Foo;
    
    use base qw/Bar/;
    

    如果需要多重继承,可以为 基础 起源 :

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

    这个 起源 pragma是Perl 5.10.1的新版本,但是如果您有一个旧版本的Perl,则可以从CPAN安装它。它是因为 基础 pragma已经变得很难维护,因为“积攒在里面的积垢”,您不应该看到两者在基本用法上的区别。

        2
  •  4
  •   Alan Haggai Alavi    15 年前

    我觉得你应该用 parent pragma而不是 base 正如在 perldoc base .

        3
  •  3
  •   Stephen Sorensen    15 年前

    基地的负责人。。。

    package Baz;
    
    use base qw( Foo Bar );
    

    本质上等同于

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

    就我个人而言,我用碱基。

        4
  •  0
  •   chammu    9 年前

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

    以下两项都是等效的:

    use base "Parent";
    

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