2009-09-04 51 views
9

Tôi muốn tạo một lớp singleton mở rộng DBI. Tôi nên làm một cái gì đó như thế này:Sự khác nhau giữa `base base` và @ISA trong Perl là gì?

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

hay này:

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

hay cái gì khác?

Không thực sự chắc chắn sự khác biệt giữa 'cơ sở sử dụng' và 'isa' là gì.

+2

Vâng, tài liệu base.pm cho bạn biết sự khác biệt. –

Trả lời

4

Tôi nghĩ bạn nên sử dụng parent pragma thay vì base như đã được đề xuất trong perldoc base.

+1

Có phải 'cha mẹ' mới ở phiên bản 5.10 không? Nó phải được, vì nó không có trong tài liệu 5.8 của tôi. – Ether

+0

Tôi không chắc chắn. Tuy nhiên, trích dẫn tuyên bố của Chas: "... pragma cha mẹ là mới như của Perl 5.10.1, nhưng nó có thể cài đặt từ CPAN nếu bạn có một phiên bản cũ của Perl. ..." –

8

Việc sử dụng điển hình của @ISA

package Foo; 

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

Các baseparent pragmas cả nạp lớp yêu cầu và sửa đổi @ISA bao gồm nó:

package Foo; 

use base qw/Bar/; 

Nếu bạn muốn đa kế thừa, bạn có thể cung cấp nhiều mô-đun đến base hoặc parent:

package Foo; 

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

parent pragma mới là Perl 5.10.1, nhưng có thể cài đặt từ CPAN nếu bạn có phiên bản cũ hơn của Perl. Nó đã được tạo ra bởi vì base pragma đã trở nên khó khăn để duy trì do "cruft đã tích lũy trong nó." Bạn sẽ không thấy sự khác biệt trong việc sử dụng cơ bản giữa hai người.

3

từ perldoc cơ sở của ...

package Baz; 

use base qw(Foo Bar); 

là về cơ bản tương đương với

package Baz; 

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

Cá nhân, tôi sử dụng cơ sở.

+1

Các cơ sở mới nhất.pm nói với mọi người sử dụng phụ huynh, trong 5.10.1. :) –

0

Nếu bạn muốn kế thừa lớp cha mẹ thì bạn sẽ cần tải nó và sửa đổi @ISA. Cả hai bước này đều được thực hiện khi bạn sử dụng Base. Cơ sở tải mô-đun cho bạn và sửa đổi @ISA cho phù hợp. Nếu không, bạn sẽ cần phải sửa đổi @ISA và tự tải mô-đun chính.

Cả hai sau đây là tương đương:

use base "Parent"; 

require Parent; 
@ISA = ("Parent"); 
Các vấn đề liên quan