zoukankan      html  css  js  c++  java
  • Perl 面向对象编程

    属性:
    
     一个对象就是一组属性的集合
    
    我们可以用数组或散列来表示这个集合
    
    #使用散列表来存储雇员的属性:
    
    [root@node01 8]# cat a6.pl 
    %employee=("name"=>"John Doe",
                "age" =>32,
                "position"=>"SoftWare Engineer");
    print "Name:,$employee{name}";
    print "
    ";
    [root@node01 8]# perl a6.pl 
    Name:,John Doe
    
    
    唯一标示:
    
    [root@node01 8]# cat a7.pl 
    #使用匿名散列表
    use Data::Dumper;
    sub new_employee{
       my ($name,$age,$starting_position)=@_;
       my $r_employee={             #使用匿名散列
          "name" =>$name,           #创建一个唯一的对象
           "age"=>$age,
           "position"=>$starting_position
    };
      return $r_employee;
    };
    
    print Dumper(new_employee());
         
    [root@node01 8]# perl a7.pl 
    $VAR1 = {
              'age' => undef,
              'position' => undef,
              'name' => undef
            };
    [root@node01 8]# vim a7.pl 
    [root@node01 8]# perl a7.pl 
    $VAR1 = {
              'age' => '29',
              'name' => 'a',
              'position' => 'cc'
            };
    [root@node01 8]# 
    
    [root@node01 8]# cat a8.pl 
    use Data::Dumper;
    sub new_employee {
      my ($name,$age,$starting_position)=@_;
      my %employee =(
         "name" =>$name,
         "age"=>$age,
         "position"=>$starting_position
    );
      return \%employee;
    };
    
    my $emp1=new_employee("John Doe",32,"Software Engineer");
    print Dumper($emp1);
    
    
    [root@node01 8]# perl a8.pl 
    $VAR1 = {
              'position' => 'Software Engineer',
              'age' => 32,
              'name' => 'John Doe'
            };
    [root@node01 8]# 
    
    行为:
    
    [root@node01 8]# cat a9.pl 
    use Data::Dumper;
    sub promote_employee {
       my $r_employee = shift;
       $r_employee->{"position"}="abc123vde345";
       print Dumper($r_employee) ;
        };
    
    my $employee={"name"=>"aaacbbb",
                  "position"=>"hangzhou"
    };
    
    promote_employee($employee);
    [root@node01 8]# perl a9.pl 
    $VAR1 = {
              'position' => 'abc123vde345',
              'name' => 'aaacbbb'
            };
    
    多态性的必要性:
    
    [root@node01 8]# cat Employee.pm 
    pacage Employee;
    ##创建正式雇员
    
    sub new_regular {
        my ($name,$age,$starting_position,$monthly_salary)=@_;
        my $employee ={
           "name"=>$name,
           "age" =>$age,
            "position"=>$starting_position,
            "monthly_salary"=>$monthly_salary,
    }
      return  $employee; ##返回对象引用
    };
    
    ##小时雇员
    sub new_hourly {
        my ($name,$age,$starting_position,$hourly_rate,$overtime_rate)=@_;
        my $employee={
           "name" =>$name,
            "age"=>$age,
            "position"=>$starting_position,
             "overtime_rate"=>$overtime_rate
    };
     return $employee;##返回对象的引用
    };
    1;
    
    -------------------------------------------------
    [root@node01 8]# cat RegularEmployee.pm 
    package RegularEmployee;
    sub new {
       my ($name,$age,$starting_position,$monthly_slary)=@_;
       my $r_employee ={
          "name" =>$name,
           "age" =>$age,
           "position"=>$starting_position,
           "monthly_salary"=>$monthly_salary,
           "months_worked" =>0
    };
       bless $r_employee,'RegularEmployee';
       return $employee; ##返回对象的引用
    };
    
    sub compute_ytd_income {
       my $r_emp=shift;
       return $r_emp->{name};
    };
    1;
    
    
    
    [root@node01 8]# cat RegularEmployee.pm 
    package RegularEmployee;
    sub new {
       my $a=shift;
       my ($name,$age,$starting_position,$monthly_slary)=@_;
       my $r_employee ={
          "name" =>$name,
           "age" =>$age,
           "position"=>$starting_position,
           "monthly_salary"=>$monthly_salary,
           "months_worked" =>0
    };
       bless $r_employee,'RegularEmployee';
       return $r_employee; ##返回对象的引用
    };
    
    sub compute_ytd_income {
       my $r_emp=shift;
       return $r_emp->{'name'};
    };
    1;
    
    
    [root@node01 8]# cat t2.pl 
    use RegularEmployee;
    
    my $r=RegularEmployee->new('aa11','bb22','cc33','dd44');
    
    print $r->compute_ytd_income();
    [root@node01 8]# perl t2.pl 
    aa11[root@node01 8]# 
    
    
    
    
    print $r->compute_ytd_income();
    
    
    Perl的实例方法没有什么神奇的地方,它总是第一个参数碰巧对对象引用的普通子过程。
    
    类方法和属性:
    
    类方法(也称做静态方法)是指那些无须特定的对象实例就能够工作的从属于类的函数。
    
    
    类属性只是包的全局变量,类方法则是不依赖于任何特定实例的普通子例程。
    
    
    继承的必要性:
    
    Perl允许一个模块在一个特殊的名为@ISA的数组中指定一组其他模块的名称
    
    [oracle@oadb 6]$ cat Employee.pm 
    package Employee;
    sub allocate {
     my ($pkg,$name,$age,$starting_position)=@_;
         my $r_employee = bless {
         "name" =>$name,
         "age" =>$age,
          "position"=>$starting_position
    }, $pkg;
      return $r_employee;
    };
    
    sub promote {
       my $r=shift;
       return $r->{'name'};
    };
    1;
       
    
    [oracle@oadb 6]$ cat HourlyEmployee.pm 
    package HourlyEmployee;
    
    @ISA=("Employee");#从Employee 继承
    sub new{
           ($pkg,$name,$age,$starting_position,$hourly_rate,$overtime_rate)=@_;
           my $self={
                name=>$name,
                age=>$age
              };
           bless $self,$pkg;
        $self->prepare();
        return $self;
    };
    --------------------------------------------------------------
    [oracle@oadb 6]$ cat Employee.pm
    package Employee;
    
    sub promote {
       my $r=shift;
       return $r->{'age'} + 99;
    };
    1;
        
    [oracle@oadb 6]$ cat HourlyEmployee.pm 
    package HourlyEmployee;
    
    @ISA=("Employee");#从Employee 继承
    sub new{
           ($pkg,$name,$age,$starting_position,$hourly_rate,$overtime_rate)=@_;
           my $self={
                name=>$name,
                age=>$age
              };
           bless $self,$pkg;
        return $self;
    };
    1;
       
             
    
      
    [oracle@oadb 6]$ cat a1.pl 
    use HourlyEmployee;
    use Employee;
    my $r=HourlyEmployee->new("aaaccc","43242");
    print $r->promote();
    [oracle@oadb 6]$ perl a1.pl 
    43341[oracle@oadb 6]$ 
    
    
    
    对象的销毁:
    
    


    
                                        
    
  • 相关阅读:
    UVa OJ 102 Ecological Bin Packing (生态学装箱问题)
    最小生成树 zoj1586 QS Network
    最小生成树&并查集 POJ 1861 Network
    最小生成树&并查集POJ 1287 Networking
    2012年亚洲长春区域赛:K Yukari's Birthday
    最小生成树 ZOJ 1203 Swordfish
    HDU 2639 Bone Collector II
    POJ2528 Mayor's posters(区间替换&&线段切割)
    POJ2777 Count Color(区间修改&&懒惰标记&&位运算)
    (转)有关如何入门ACM
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13349756.html
Copyright © 2011-2022 走看看