• 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]$ 
    

  • 相关阅读:
    VS2015预览版中的C#6.0 新功能(一)
    REST总结
    MVC和传统的以模板为中心的web架构比较
    实现两个select list box间item的移动和过滤
    异步编程
    简述System.Windows.Forms.Timer 与System.Timers.Timer用法区别
    C#导出EXCEL,并生成charts表
    CRC16位校验
    c# 后台GET、POST、PUT、DELETE传输发送json数据
    UDP通讯
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13349724.html
Copyright © 2020-2023  润新知