属性:
一个对象就是一组属性的集合
我们可以用数组或散列来表示这个集合
#使用散列表来存储雇员的属性:
[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]$
对象的销毁: