我想创建一个扩展DBI的单例类。我应该做这样的事情:
use base 'Class::Singleton';
our @ISA = ('DBI');
或者这个:
our @ISA = ('Class::Singleton', 'DBI');
或其他什么?
不确定'use base'和'isa'之间的区别是什么。
答案 0 :(得分:8)
@ISA
的典型用法是
package Foo;
require Bar;
our @ISA = qw/Bar/;
base
和parent
pragma都会加载请求的类并修改@ISA
以包含它:
package Foo;
use base qw/Bar/;
如果您想要多重继承,可以向base
或parent
提供多个模块:
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");