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



对象的销毁:




                                    
原文地址:https://www.cnblogs.com/hzcya1995/p/13349756.html