Perl 教程 之 Perl 面向对象 7
Perl 面向对象
Perl 中有两种不同地面向对象编程的实现:
一是基于匿名哈希表的方式,每个对象实例的实质就是一个指向匿名哈希表的引用。在这个匿名哈希表中,存储了所有的实例属性。
二是基于数组的方式,在定义一个类的时候,我们将为每一个实例属性创建一个数组,而每一个对象实例的实质就是一个指向这些数组中某一行索引的引用。在这些数组中,存储着所有的实例属性。
默认载入
如果在当前类、当前类所有的基类、还有 UNIVERSAL 类中都找不到请求的方法, 这时会再次查找名为 AUTOLOAD() 的一个方法。如果找到了 AUTOLOAD,那么就会 调用,同时设定全局变量 $AUTOLOAD 的值为缺失的方法的全限定名称。
如果还不行,那么 Perl 就宣告失败并出错。
如果你不想继承基类的 AUTOLOAD,很简单,只需要一句:
sub AUTOLOAD;
析构函数及垃圾回收
当对象的最后一个引用释放时,对象会自动析构。
如果你想在析构的时候做些什么,那么你可以在类中定义一个名为"DESTROY"的方法。它将在适合的时机自动调用,并且按照你的意思执行额外的清理动作。
package MyClass;
...
sub DESTROY
{
print "MyClass::DESTROY called\n";
}
Perl 会把对象的引用作为 唯一的参数传递给 DESTROY。注意这个引用是只读的,也就是说你不能通过访问$[0] 来修改它。(译者注:参见 perlsub)但是对象自身(比如 "${$[0]" 或者 "@{$[0]}" 还有 "%{$[0]}" 等等)还是可写的。
如果你在析构器返回之前重新 bless 了对象引用,那么 Perl 会在析构器返回之后接着调用你重新 bless 的那个对象的 DESTROY 方法。这可以让你有机会调用基类或者你指定的其它类的析构器。需要说明的是,DESTROY 也可以手工调用,但是通常没有必要这么做。
在当前对象释放后,包含在当前对象中的其它对象会自动释放。