zoukankan      html  css  js  c++  java
  • 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]$ 
    

  • 相关阅读:
    py2exe
    Python库
    Python正则表达式指南
    [Python]日志模块logging的应用
    [Python]python __init__.py
    如何安装配置ulipad
    [Python]如何快速知道要使用哪些python模块和有哪些功能
    CodeIgniter
    Python 绝对简明手册
    理解Python命名机制
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13349724.html
Copyright © 2011-2022 走看看