2009-09-04 17 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のドキュメントはあなたに違いを伝えます。 –

答えて

4

perldoc baseで提案されているように、baseの代わりにparentプラグマを使用する必要があります。あなたは多重継承をしたい場合は

package Foo; 

use base qw/Bar/; 

、あなたが供給することができます:

+1

5.10では 'parent'が新しくなっていますか?それは私の5.8の文書にはないので、そうでなければなりません。 – Ether

+0

わかりません。しかし、Chasの声明を引用しています: "...親のプラグマはPerl 5.10.1から新しくなっていますが、古いバージョンのPerlをお持ちの場合はCPANからインストール可能です..." –

8

@ISAの典型的な使用は、要求されたクラスをロードし、それを含めるように@ISAを変更し、両方の

package Foo; 

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

baseparentプラグマです複数のモジュールをbaseまたはparentに:

package Foo; 

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

parentプラグマは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にある親を使用してください。 :) –

0

親クラスを継承する場合は、ロードして@ISAを変更する必要があります。この2つのステップは、ベースを使用するときに処理されます。ベースはあなたのためにモジュールをロードし、それに応じて@ISAを変更します。それ以外の場合は、@ISAを変更して親モジュールを独自にロードする必要があります。次の

はどちらも同じです。

use base "Parent"; 

require Parent; 
@ISA = ("Parent"); 
関連する問題