12.5.1 通过 @ISA 继承

如果@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]$ 

原文地址:https://www.cnblogs.com/hzcya1995/p/13349724.html