zoukankan      html  css  js  c++  java
  • perl 继承 @ISA

    12.5 类继承
    
    对Perl的对象剩下的内容而言,从一个类继承另外一个类并不需要给这门语法增加特殊的语法,当你调用一个方法的时候,
    
    如果Perl在调用者的包里找不到这个字过程,那么他就检查@ISA数组
    
    perl是这样实现继承的,一个包@ISA数组了的每个元素都保持另外一个包的名字
    
    
    当缺失方法的时候就搜索这些包。
    
    比如,下面的代码把Horse类变成了Critter类的子类 (这里Critter是父类,或称为基类)
    
    
    我们用our 声明@ISA,因为它必须是一个打包的变量,而不是用my声明
    
    package Horse;
    our @ISA = "Critter";
    
    
    你现在可以在原来Critter使用的任何地方使用Horse类或者对象了
    
    Critter 是一个正确的基类,可以用于 继承。
    
    
    Horse 类:
    [root@wx03 test]# cat Horse.pm 
    package Horse;
    our @ISA = "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;
    
    
    
    基类 Critter类:
    
    [root@wx03 test]# 
    [root@wx03 test]# 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;
    
    
    [root@wx03 test]# cat t6.pl 
    unshift(@INC,"/root/test"); 
    use Horse;;
    #use base qw(Critter);
    require Critter;
    use Data::Dumper;
    $ed = Horse->new; # 四腿湾马
    print $ed->sum_arr(4,5);
    print "
    ";
    print $ed->sum(4,5);
    
    [root@wx03 test]# perl t6.pl 
    16
    9[root@wx03 test]# 
    
    
    
    假设你在 $steed 里有一个 Horse 对象,并且在他上面调用了一个 move:
    $steed->move(10);
    因为 $steed 是一个 Horse,Perl 对该方法的第一个选择是 Horse::move 子过程。如果 没有,Perl 先询问
    
    @Horse::ISA 的第一个元素,而不是生成一个运行时错误,这样将导致 查询到 Critter 包里,并找到
    
    Critter::move。如果也没有找到这个子过程,而且 Critter 有自己的 @Critter::ISA 数组,那么继续查询那里面
    
    的父类,看看有没有一个 move 方法,如此类推直到上升到继承级别里面一个没有 @ISA 的包
    

  • 相关阅读:
    bobojquery筛选数组之grep、each、inArray、map的用法及遍历json对象 [转]
    bobojquery遍历json键值对
    python安装与初始
    Lambda表达式
    静态代理模式
    多线程
    java日期时间
    Git安装
    Node.js环境安装
    Maven的使用
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13350787.html
Copyright © 2011-2022 走看看