zoukankan      html  css  js  c++  java
  • 第十二章 对象(下)

    第十二章 对象(下)
    
    12.5.1 通过 @ISA 继承
    
    package Mule;
    our @ISA= ("Horse", "Donkey");
    
    Perl 将首先在Horse 里(和他的任何前辈类里,比如Critter)查找任何在Mule里找不到的方法,
    
    
    找不到以后才继续在Donkey 和其父类里进行查找。
    
    
    如果缺失的方法在一个基类里发现,Perl内部把该位置缓存到当前类里,依次提高效率,
    
    
    当 Perl 搜索一个方法的时候,它确信你没有创建一个闭环的继承级别。如果两个类互相 继承则可能出现这个问
    题
    
    Vsftp:/root/perl/9# 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 声明父类:
    
    Vsftp:/root/perl/9# cat Horse.pm 
    package Horse;
    use base ("Critter");
    sub new {
    my $invocant = shift;
    my $class = ref($invocant) || $invocant;
    my $self = {
    color => "bay",
    legs => 4,
    owner => undef,
    @_, # 覆盖以前的属性
    };
    return bless $self, $class;
    };
    sub sum_arr {
           $self=shift;
           my $a=shift;
           my $b=shift;
           return $a + $b + 7;
    };
    1;
    Vsftp:/root/perl/9# cat Critter.pm 
    package Critter;
    sub new {
        my $self = {};
        my $invocant = shift;    
    my $class = ref($invocant) || $invocant;
    	my ($name)=@_;    
          my $self = {    
             "name" =>$name    
                     };  
        bless $self, $class; # Use class name to bless() reference
        return $self;
    
    };
    
    sub sum {
           $self=shift;
           my $a=shift;
           my $b=shift;
           return $a + $b;
    };
    1;
    Vsftp:/root/perl/9# cat a1.pl 
    unshift(@INC,"/root/perl/9"); 
    use Horse;;
    use Critter;
    use Data::Dumper;
    $ed = Horse->new; # 四腿湾马
    print $ed->sum_arr(4,5);
    print "
    ";
    print $ed->sum(4,5);
    print "
    ";
    Vsftp:/root/perl/9# perl a1.pl 
    16
    9
    
    
    
    
    12.5.2  访问被覆盖的方法:
    
    基类就是父类:
    
    Vsftp:/root/perl/9# cat Horse.pm 
    package Horse;
    use base ("Critter");
    sub new {
    my $invocant = shift;
    my $class = ref($invocant) || $invocant;
    my $self = {
    color => "bay",
    legs => 4,
    owner => undef,
    @_, # 覆盖以前的属性
    };
    return bless $self, $class;
    };
    sub sum {
           $self=shift;
           my $a=shift;
           my $b=shift;
           return $a + $b + 7;
    };
    1;
    Vsftp:/root/perl/9# cat Critter.pm 
    package Critter;
    sub new {
        my $self = {};
        my $invocant = shift;    
    my $class = ref($invocant) || $invocant;
    	my ($name)=@_;    
          my $self = {    
             "name" =>$name    
                     };  
        bless $self, $class; # Use class name to bless() reference
        return $self;
    
    };
    
    sub sum {
           $self=shift;
           my $a=shift;
           my $b=shift;
           return $a + $b;
    };
    1;
    Vsftp:/root/perl/9# cat a1.pl 
    unshift(@INC,"/root/perl/9"); 
    use Horse;;
    use Critter;
    use Data::Dumper;
    $ed = Horse->new; # 四腿湾马
    #print $ed->sum_arr(4,5);
    print "
    ";
    print $ed->sum(4,5);
    print "
    ";
    Vsftp:/root/perl/9# perl a1.pl 
    
    16
    
    此时Horse 类覆盖了基类Critter的 sum方法
    
    
    Vsftp:/root/perl/9# cat a1.pl 
    unshift(@INC,"/root/perl/9"); 
    use Horse;;
    use Critter;
    use Data::Dumper;
    $ed = Horse->new; # 四腿湾马
    print $ed->Critter::sum(4,5);
    print "
    ";
    print $ed->sum(4,5);
    print "
    ";
    Vsftp:/root/perl/9# perl a1.pl 
    9
    16
    
    
    调用父类Critter::sum sum的方法
    
    Vsftp:/root/perl/9# cat a1.pl 
    unshift(@INC,"/root/perl/9"); 
    use Horse;;
    use Critter;
    use base qw(Critter);
    use Data::Dumper;
    $ed = Horse->new; # 四腿湾马
    print $ed->SUPER::sum(4,5);
    print "
    ";
    print $ed->sum(4,5);
    print "
    ";
    Vsftp:/root/perl/9# perl a1.pl 
    9
    16
    
    
    
    12.5.3  UNIVERSAL:最终的祖先类
    
    
    12.5.4 方法自动装载
    
    
    12.5.5 私有方法
    

  • 相关阅读:
    Python_Note_08Day 9_HTML
    Python_Note_08Day 6_Bastion Host_Paramiko_SSH
    Python_Note_08Day 5_Module
    Python_Note_Day 11_Mysql02_Python MySQL API
    Python_Note_Day 11_Mysql
    Python_Data_Analysis_01
    485. Max Consecutive Ones
    498. Diagonal Traverse
    500. Keyboard Row
    481. Magical String
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13350002.html
Copyright © 2011-2022 走看看