术语汇编 Perl析构函数简介

开发 架构
Perl语言中Perl析构函数有很多只,那么你对它的概念你是否了解,这里和大家简单分享一下,希望本文的介绍能让你有所收获。

本文和大家重点讨论一下Perl析构函数,Perl跟踪对象的链接数目,当某对象的***一个应用释放到内存池时,该对象就自动销毁。对象的析构发生在代码停止后,脚本将要结束时。

Perl析构函数

一、Perl析构函数简介

Perl跟踪对象的链接数目,当某对象的***一个应用释放到内存池时,该对象就自动销毁。对象的析构发生在代码停止后,脚本将要结束时。对于全局变量而言,析构发生在***一行代码运行之后。
如果你想在对象被释放之前获取控制权,可以定义DESTROY()方法。DESTROY()在对象将释放前被调用,使你可以做一些清理工作。DESTROY()函数不自动调用其它DESTROY()函数,Perl不做内置的析构工作。如果构造函数从基类多次bless,DESTROY()可能需要调用其它类的DESTROY()函数。当一个对象被释放时,其内含的所有对象引用自动释放、销毁。
一般来说,不需要定义DESTROY()函数,如果需要,其形式如下:

  1. subDESTROY{  
  2. #  
  3. #Addcodehere.  
  4. #  
  5. }  

因为多种目的,Perl使用了简单的、基于引用的垃圾回收系统。任何对象的引用数目必须大于零,否则该对象的内存就被释放。当程序退出时,Perl的一个彻底的查找并销毁函数进行垃圾回收,进程中的一切被简单地删除。在UNIX类的系统中,这像是多余的,但在内嵌式系统或多线程环境中这确实很必要。

二、Perl析构函数之继承

类方法通过@ISA数组继承,变量的继承必须明确设定。下例创建两个类Bean.pm和Coffee.pm,其中Coffee.pm继承Bean.pm的一些功能。此例演示如何从基类(或称超类)继承实例变量,其方法为调用基类的构造函数并把自己的实例变量加到新对象中。
Bean.pm代码如下:

  1. packageBean;  
  2. requireExporter;  
  3. @ISA=qw(Exporter);  
  4. @EXPORT=qw(setBeanType);  
  5.  
  6. subnew{  
  7. my$type=shift;  
  8. my$this={};  
  9. $this->{'Bean'}='Colombian';  
  10. bless$this,$type;  
  11. return$this;  
  12. }  
  13.  
  14. #  
  15. #Thissubroutinesetstheclassname  
  16. subsetBeanType{  
  17. my($class,$name)=@_;  
  18. $class->{'Bean'}=$name;  
  19. print"Setbeanto$name\n";  
  20. }  
  21. 1;  
  22.  

此类中,用$this变量设置一个匿名哈希表,将'Bean'类型设为'Colombian'。方法setBeanType()用于改变'Bean'类型,它使用$class引用获得对对象哈希表的访问。

三、Perl析构函数之子类方法的重载

继承的好处在于可以获得基类输出的方法的功能,而有时需要对基类的方法重载以获得更具体或不同的功能。下面在Bean.pm类中加入方法printType(),代码如下:

  1. subprintType{  
  2. my$class=shift@_;  
  3. print"ThetypeofBeanis$class->{'Bean'}\n";  
  4. }  

然后更新其@EXPORT数组来输出:
@EXPORT=qw(setBeanType,printType);
现在来调用函数printType(),有三种调用方法:

  1. $cup->Coffee::printType();  
  2. $cup->printType();  
  3. $cup->Bean::printType();  

输出分别如下:

ThetypeofBeanisMixed
ThetypeofBeanisMixed
ThetypeofBeanisMixed
为什么都一样呢?因为在子类中没有定义函数printType(),所以实际均调用了基类中的方法。如果想使子类有其自己的printType()函数,必须在Coffee.pm类中加以定义:

  1. #  
  2. #Thisroutineprintsthetypeof$class->{'Coffee'}  
  3. #  
  4. subprintType{  
  5. my$class=shift@_;  
  6. print"ThetypeofCoffeeis$class->{'Coffee'}\n";  
  7. }  
  8.  

 然后更新其@EXPORT数组:
@EXPORT=qw(setImports,declareMain,closeMain,printType);
现在输出结果变成了:

ThetypeofCoffeeisInstant
ThetypeofCoffeeisInstant
ThetypeofBeanisMixed
现在只有当给定了Bean::时才调用基类的方法,否则直接调用子类的方法。
那么如果不知道基类名该如何调用基类方法呢?方法是使用伪类保留字SUPER::。在类方法内使用语法如:$this->SUPER::function(...argumentlist...);,它将从@ISA列表中寻找。刚才的语句用SUPER::替换Bean::可以写为$cup->SUPER::printType();,其结果输出相同,为:

ThetypeofBeanisMixed

四、Perl析构函数中Perl类和对象的一些注释

OOP的***好处就是代码重用。OOP用数据封装来隐藏一些复杂的代码,Perl的包和模块通过my函数提供数据封装功能,但是Perl并不保证子类一定不会直接访问基类的变量,这确实减少了数据封装的好处,虽然这种动作是可以做到的,但却是个很坏的编程风格。
注意:
1、一定要通过方法来访问类变量。
2、一定不要从模块外部直接访问类变量。

当编写包时,应该保证方法所需的条件已具备或通过参数传递给它。在包内部,应保证对全局变量的访问只用通过方法传递的引用来访问。对于方法要使用的静态或全局数据,应该在基类中用local()来定义,子类通过调用基类来获取。有时,子类可能需要改变这种数据,这时,基类可能就不知道怎样去寻找新的数据,因此,这时***定义对该数据的引用,子类和基类都通过引用来改变该数据。

***,你将看到如下方式来使用对象和类:
usecoffee::Bean;
这句语句的含义是“在@INC数组所有目录的Coffee子目录来寻找Bean.pm”。如果把Bean.pm移到./Coffee目录,上面的例子将用这一use语句来工作。这样的好处是有条理地组织类的代码。再如,下面的语句:
useAnother::Sub::Menu;
意味着如下子目录树:./Another/Sub/Menu.pm

【编辑推荐】

  1. 深入学习Perl文件系统用法
  2. Perl格式化输出概念详解
  3. 实例解析Perl守护进程用法
  4. 解析Perl文件系统应用中函数的语法
  5. 术语汇编 Perl变量中Perl关联数组用法解析
责任编辑:佚名 来源: csdn.net
相关推荐

2010-07-26 16:54:15

Perl引用

2010-07-13 09:02:16

Perl

2010-07-13 10:21:19

2010-06-07 13:02:46

Hadoop简介

2010-07-19 16:56:56

Perl线程

2010-09-17 09:19:08

Java API

2010-07-15 17:50:47

Perl模式

2010-07-20 09:05:08

Perl类

2010-06-10 18:27:00

UML语言

2010-08-10 10:32:02

Flex语言

2010-07-15 15:47:46

Perl守护进程

2010-06-11 18:27:39

UML对象图

2010-07-08 09:50:11

UML构件图

2010-06-11 09:33:47

UML顺序图

2010-07-14 15:05:21

Perl文件句柄

2010-07-14 11:27:42

Perl多进程

2010-06-10 15:49:55

UML协作图

2010-05-28 13:18:55

SVN代码库

2010-06-11 10:44:14

UML部署图

2010-07-08 09:57:14

UML活动图
点赞
收藏

51CTO技术栈公众号