2009-09-04 2 views
9

Ich möchte eine Singleton-Klasse machen, die DBI erweitert. sollte ich so etwas wie dies tun:Was ist der Unterschied zwischen `base verwenden 'und @ISA in Perl?

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

oder dies:

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

oder etwas anderes?

Nicht wirklich sicher, was der Unterschied zwischen 'Base verwenden' und 'ISA' ist.

+2

Nun, die base.pm Dokumentation Sie den Unterschied erklärt. –

Antwort

4

Ich denke, Sie sollten das parent Pragma statt base verwenden, wie in perldoc base vorgeschlagen wurde.

+1

Ist 'Eltern' neu in 5.10? Es muss sein, da es nicht in meiner 5.8 Dokumentation ist. – Ether

+0

Ich bin mir nicht sicher. Zitat von Chas Aussage: "... Das Parent-Pragma ist neu ab Perl 5.10.1, aber es ist von CPAN installierbar, wenn Sie eine ältere Perl-Version haben. ..." –

8

Die typische Verwendung von @ISA ist

package Foo; 

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

Die base und parent pragmas sowohl die angeforderte Klasse laden und @ISA modifizieren enthalten:

package Foo; 

use base qw/Bar/; 

Wenn Sie mehrere Vererbungs möchten, können Sie liefern mehr als ein Modul zu base oder parent:

package Foo; 

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

Das Pragma parent ist neu ab Perl 5.10.1, aber es ist von CPAN installierbar, wenn Sie eine ältere Version von Perl haben. Es wurde geschaffen, weil das Pragma base aufgrund des sich in ihm angesammelten Crust schwer zu pflegen war. Sie sollten keinen Unterschied in der Grundnutzung zwischen den beiden sehen.

3

von Perldoc Base ...

package Baz; 

use base qw(Foo Bar); 

ist im wesentlichen äquivalent zu

package Baz; 

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

persönlich I Basis verwenden.

+1

Die neuste base.pm sagt Leuten zu Verwenden Sie Eltern, die in 5.10.1 ist. :) –

0

Wenn Sie die Elternklasse erben möchten, müssen Sie sie laden und @ISA ändern. Diese beiden Schritte werden bei der Verwendung von Base durchgeführt. Base lädt das Modul für Sie und ändert @ISA entsprechend. Andernfalls müssten Sie @ISA ändern und das übergeordnete Modul selbst laden.

die beiden folgenden äquivalent:

use base "Parent"; 

und

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