我想做一個擴展DBI的單例類。我應該做這樣的事情:在Perl中`use base`和@ISA有什麼區別?
use base 'Class::Singleton';
our @ISA = ('DBI');
或本:
our @ISA = ('Class::Singleton', 'DBI');
或其他什麼東西?
不確定'use base'和'isa'之間的區別是什麼。
我想做一個擴展DBI的單例類。我應該做這樣的事情:在Perl中`use base`和@ISA有什麼區別?
use base 'Class::Singleton';
our @ISA = ('DBI');
或本:
our @ISA = ('Class::Singleton', 'DBI');
或其他什麼東西?
不確定'use base'和'isa'之間的區別是什麼。
我想你應該使用parent
編譯指示而不是base
,正如perldoc base
中所建議的那樣。
5.10是'父'嗎?它必須是,因爲它不在我的5.8文檔中。 – Ether 2009-09-04 16:56:47
我不確定。然而,引用Chas的聲明:「... Perl 5.10.1的父編譯器是新的,但如果您有舊版Perl,則可以從CPAN安裝...」 – 2009-09-04 17:11:41
的典型用途@ISA
是
package Foo;
require Bar;
our @ISA = qw/Bar/;
的base
和parent
編譯指示都加載所請求的類,並修改@ISA
包括它:
package Foo;
use base qw/Bar/;
如果你想多繼承,您可以提供多於一個模塊至base
或parent
:
package Foo;
use parent qw/Bar Baz/; #@ISA is now ("Bar", "Baz");
parent
pragma是Perl 5.10.1中的新增功能,但如果您有較舊版本的Perl,則可以從CPAN安裝。它的創建是因爲base
編譯指示由於「積累在其中的殘留物」而難以維護。你不應該在兩者之間的基本用途上看到不同。
從底座的的perldoc ...
package Baz;
use base qw(Foo Bar);
基本上等同於
package Baz;
BEGIN {
require Foo;
require Bar;
push @ISA, qw(Foo Bar);
}
就個人而言,我使用基地。
最新的base.pm告訴人們使用5.10.1中的父親。 :) – 2009-09-04 16:32:57
如果你想繼承父類,那麼你需要加載它並修改@ISA。當您使用Base時,這兩個步驟都會照顧到。 Base會爲您加載模塊並相應地修改@ISA。否則,您需要修改@ISA並自行加載父模塊。
下面的兩個是等價的:
use base "Parent";
和
require Parent;
@ISA = ("Parent");
好了,base.pm文檔告訴你的差異。 – 2009-09-04 16:33:53