如果@ISA 包含多余一个包的名字,包的搜索都是从左向右的顺序进行的。
这些搜索是有浅入深的,因此,如果有一个Mule类有像下面这样的继承关系:
package Mule;
our @ISA= ("Horse", "Donkey");
Mule 类继承了Horse 和Donkey 类:
Perl 将首先在Horse里(和他的任何前辈类里,比如Critter)里查找任何在Mule里找不到的方法,
找不到以后才继续在Donkey和其父类里进行查找。
例如:
[oracle@oadb 7]$ cat Horse.pm
package Horse;
our @ISA = "Critter";
sub new {
my $class=shift;
my %p=@_;
my $self ={
name=>$p{'name'},
color =>$p{'color'}
};
bless $self,$class;
}
sub funh1 {
my $self=shift;
my $a=shift;
my $b=shift;
return $a + $b;
}
1;
[oracle@oadb 7]$ cat Critter.pm
package Critter;
sub move {
my $self=shift;
my $a=shift;
my $b=shift;
return $a + $b;
};
1;
[oracle@oadb 7]$ cat Mule.pm
package Mule;
our @ISA= ("Horse", "Donkey");
sub new {
my $class=shift;
my $self={};
bless $self,$class;
};
1;
[oracle@oadb 7]$ cat Donkey.pm
package Donkey;
sub muge {
my $self=shift;
my $a=shift;
my $b=shift;
return $a * $b;
};
1;
[oracle@oadb 7]$ cat a1.pl
use Horse;
use Mule;
my $r=Mule->new();
print $r->move(56,23);
[oracle@oadb 7]$ perl a1.pl
Can't locate object method "move" via package "Mule" at a1.pl line 4.
[oracle@oadb 7]$
[oracle@oadb 7]$ cat a1.pl
use Horse;
use Mule;
use Critter;
my $r=Mule->new();
print $r->move(56,23);
[oracle@oadb 7]$ perl a1.pl
79[oracle@oadb 7]$
[oracle@oadb 7]$ cat Mule.pm
package Mule;
our @ISA= ("Horse", "Donkey");
sub new {
my $class=shift;
my $self={};
bless $self,$class;
};
sub move {
my $self=shift;
my $a=shift;
my $b=shift;
return $a * $b;
};
1;
[oracle@oadb 7]$ perl a1.pl
1288[oracle@oadb 7]$
先找Mule类,在找Horse类
---------------------------------------------------
两个类相互继承:
[oracle@oadb 7]$ cat Horse.pm
package Horse;
our @ISA = "Critter";
sub new {
my $class=shift;
my %p=@_;
my $self ={
name=>$p{'name'},
color =>$p{'color'}
};
bless $self,$class;
}
sub funh1 {
my $self=shift;
my $a=shift;
my $b=shift;
return $a + $b;
}
1;
[oracle@oadb 7]$ cat Critter.pm
package Critter;
our @ISA = "Horse";
sub move {
my $self=shift;
my $a=shift;
my $b=shift;
return $a + $b;
};
1;
[oracle@oadb 7]$ cat a1.pl
use Horse;
use Mule;
use Critter;
my $r=Mule->new();
print $r->move(56,23);
[oracle@oadb 7]$ perl a1.pl
Recursive inheritance detected in package 'Horse' at Critter.pm line 2.
Compilation failed in require at a1.pl line 3.
BEGIN failed--compilation aborted at a1.pl line 3.
利用 use base继承:
[oracle@oadb 7]$ cat Horse.pm
package Horse;
use base qw/Critter/;
sub new {
my $class=shift;
my %p=@_;
my $self ={
name=>$p{'name'},
color =>$p{'color'}
};
bless $self,$class;
}
sub funh1 {
my $self=shift;
my $a=shift;
my $b=shift;
return $a + $b;
}
1;
[oracle@oadb 7]$ cat Critter.pm
package Critter;
sub move {
my $self=shift;
my $a=shift;
my $b=shift;
return $a + $b;
};
1;
[oracle@oadb 7]$ cat a2.pl
use Horse;
my $r=Horse->new();
print $r->move(34,45);
[oracle@oadb 7]$ perl a2.pl
79[oracle@oadb 7]$