当前位置:K88软件开发文章中心编程语言PerlPerl01 → 文章内容

Perl 面向对象

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-11 13:11:02

Perl 面向对象Perl 中有两种不同地面向对象编程的实现:一是基于匿名哈希表的方式,每个对象实例的实质就是一个指向匿名哈希表的引用。在这个匿名哈希表中,存储来所有的实例属性。二是基于数组的方式,在定义一个类的时候,我们将为每一个实例属性创建一个数组,而每一个对象实例的实质就是一个指向这些数组中某一行索引的引用。在这些数组中,存储着所有的实例属性。面向对象基础概念面向对象有很多基础概念,这里我们接收三个:对象、类和方法。对象:对象是对类中数据项的引用。.类:类是个Perl包,其中含提供对象方法的类。方法:方法是个Perl子程序,类名是其第一个参数。Perl 提供了 bless() 函数,bless 是用来构造对象的, 通过 bless 把一个引用和这个类名相关联,返回这个引用就构造出一个对象。类的定义一个类只是一个简单的包。可以把一个包当作一个类用,并且把包里的函数当作类的方法来用。Perl 的包提供了独立的命名空间,所以不同包的方法与变量名不会冲突。Perl 类的文件后缀为 .pm。接下来我们创建一个 Person 类:package Person;类的代码范围到脚本文件的最后一行,或者到下一个 package 关键字前。创建和使用对象创建一个类的实例 (对象) 我们需要定义一个构造函数,大多数程序使用类名作为构造函数,Perl 中可以使用任何名字。你可以使用多种 Perl 的变量作为 Perl 的对象。大多数情况下我们会使用引用数组或哈希。接下来我们为 Person 类创建一个构造函数,使用了 Perl 的哈希引用。在创建对象时,你需要提供一个构造函数,它是一个子程序,返回对象的引用。实例如下:实例package Person;sub new{my $class = shift;my $self = {_firstName => shift,_lastName => shift,_ssn => shift,};





# 输出用户信息print "名字:$self->{_firstName}\n";print "姓氏:$self->{_lastName}\n";print "编号:$self->{_ssn}\n";bless $self, $class;return $self;}接下来我们创建一个对象:$object = new Person( "小明", "王", 23234345);定义方法Perl类的方法只但是是个Perl子程序而已,也即通常所说的成员函数。Perl面向对象中Perl的方法定义不提供任何特别语法,但规定方法的第一个参数为对象或其被引用的包。Perl 没有提供私有变量,但我们可以通过辅助的方式来管理对象数据。接下来我们定义一个获取名字的方法:sub getFirstName { return $self->{_firstName};}同样也可以这么写:sub setFirstName { my ( $self, $firstName ) = @_; $self->{_firstName} = $firstName if defined($firstName); return $self->{_firstName};}接下来我们修改 Person.pm 文件的代码,如下所示:实例





#!/usr/bin/perl package Person;sub new{my $class = shift;my $self = {_firstName => shift,_lastName => shift,_ssn => shift,};





# 输出用户信息print "名字:$self->{_firstName}\n";print "姓氏:$self->{_lastName}\n";print "编号:$self->{_ssn}\n";bless $self, $class;return $self;}sub setFirstName {my ( $self, $firstName ) = @_;$self->{_firstName} = $firstName if defined($firstName);return $self->{_firstName};}sub getFirstName {my( $self ) = @_;return $self->{_firstName};}1;employee.pl 脚本代码如下:实例





#!/usr/bin/perluse Person;$object = new Person( "小明", "王", 23234345);





# 获取姓名$firstName = $object->getFirstName();print "设置前姓名为 :





$firstName\n";





# 使用辅助函数设置姓名$object->setFirstName( "小强" );





# 通过辅助函数获取姓名$firstName = $object->getFirstName();print "设置后姓名为 :





$firstName\n";执行以上程序后,输出结果为:$ perl employee.pl名字:小明姓氏:王编号:23234345设置前姓名为 :





小明设置后姓名为 :





小强继承Perl 里 类方法通过@ISA数组继承,这个数组里面包含其他包(类)的名字,变量的继承必须明确设定。多继承就是这个@ISA数组包含多个类(包)名字。通过@ISA只能继承方法,不能继承数据。接下来我们创建一个 Employee 类继承 Person 类。Employee.pm 文件代码如下所示:实例





#!/usr/bin/perlpackage Employee;use Person;use strict;our @ISA = qw(Person);





# 从 Person 继承现在 Employee 类包含了 Person 类的所有方法和属性,我们在 main.pl 文件中输入以下代码,并执行:





实例





#!/usr/bin/perluse Employee;$object = new Employee( "小明", "王", 23234345);





# 获取姓名$firstName = $object->getFirstName();print "设置前姓名为 :





$firstName\n";





# 使用辅助函数设置姓名$object->setFirstName( "小强" );





# 通过辅助函数获取姓名$firstName = $object->getFirstName();print "设置后姓名为 :





$firstName\n";执行以上程序后,输出结果为:$ perl main.pl名字:小明姓氏:王编号:23234345设置前姓名为 :





小明设置后姓名为 :





小强方法重写上面实例中,Employee 类继承了 Person 类,但如果 Person 类的方法无法满足需求,就需要对其方法进行重写。接下来我们在 Employee 类中添加一些新方法,并重写了 Person 类的方法:实例





#!/usr/bin/perlpackage Employee;use Person;use strict;our @ISA = qw(Person);





# 从 Person 继承





# 重写构造函数sub new {my ($class) = @_;





# 调用父类的构造函数my $self = $class->SUPER:





:





new( $_[1], $_[2], $_[3] );





# 添加更多属性$self->{_id} = undef;$self->{_title} = undef;bless $self, $class;return $self;}





# 重写方法sub getFirstName {my( $self ) = @_;





# 这是子类函数print "这是子类函数\n";return $self->{_firstName};}





# 添加方法sub setLastName{my ( $self, $lastName ) = @_;$self->{_lastName} = $lastName if defined($lastName);return $self->{_lastName};}sub getLastName {my( $self ) = @_;return $self->{_lastName};}1;我们在 main.pl 文件中输入以下代码,并执行:





实例





#!/usr/bin/perluse Employee;$object = new Employee( "小明", "王", 23234345);





# 获取姓名,使用修改后的构造函数$firstName = $object->getFirstName();print "设置前姓名为 :





$firstName\n";





# 使用辅助函数设置姓名$object->setFirstName( "小强" );





# 通过辅助函数获取姓名$firstName = $object->getFirstName();print "设置后姓

[1] [2]  下一页


Perl 面向对象