| 
 
     
- UID
 - 1 
 - 威望
 - 1240 点 
 - 金钱
 - 24019 金币 
 - 点卡
 - 317 点 
 
  | 
4#
 
 
发表于 2003-7-15 06:46
 |  只看该作者
 
 
 
Perl的面向对象编程
现在,我们写一个简单的Perl脚本来使用该类的方法,下面是创建一个Java applet源代码骨架的脚本代码:  
#!/usr/bin/perl 
use Cocoa; 
$cup = new Cocoa; 
$cup->setImports( 'java.io.InputStream', 'java.net.*'); 
$cup->declareMain( "Msg" , "java.applet.Applet", "Runnable"); 
$cup->closeMain(); 
这段脚本创建了一个叫做Msg的Java applet,它扩展(extend)了java.applet.Applet小应用程序并使之可运行(runnable),其中最后三行也可以写成如下:  
Cocoa::setImports($cup, 'java.io.InputStream', 'java.net.*'); 
Cocoa::declareMain($cup, "Msg" , "java.applet.Applet", "Runnable"); 
Cocoa::closeMain($cup);  
其运行结果如下:  
/* 
** Created by Cocoa.pm 
** Use at own risk  
*/ 
import java.io.InputStream; 
import java.net.*; 
public class Msg extends java.applet.Applet implements Runnable { 
}  
注意:如果用->操作符调用方法(也叫间接调用),参数必须用括号括起来,如:$cup->setImports( 'java.io.InputStream', 'java.net.*');而双冒号调用如:Cocoa::setImports($cup, 'java.io.InputStream', 'java.net.*');也可去掉括号写成:Cocoa::setImports $cup, 'java.io.InputStream', 'java.net.*' ; 
八、重载 
有时需要指定使用哪个类的方法,如两个不同的类有同名方法的时候。假设类Espresso和Qava都定义了方法grind,可以用::操作符指定使用Qava的方法: 
$mess = Qava::grind("whole","lotta","bags"); 
Qava::grind($mess, "whole","lotta","bags"); 
可以根据程序的运行情况来选择使用哪个类的方法,这可以通过使用符号引用去调用来实现: 
$method = $local ? "Qava::" : "Espresso::"; 
$cup->{$method}grind(@args); 
九、析构函数 
Perl跟踪对象的链接数目,当某对象的最后一个应用释放到内存池时,该对象就自动销毁。对象的析构发生在代码停止后,脚本将要结束时。对于全局变量而言,析构发生在最后一行代码运行之后。 
如果你想在对象被释放之前获取控制权,可以定义DESTROY()方法。DESTROY()在对象将释放前被调用,使你可以做一些清理工作。DESTROY()函数不自动调用其它DESTROY()函数,Perl不做内置的析构工作。如果构造函数从基类多次bless,DESTROY()可能需要调用其它类的DESTROY()函数。当一个对象被释放时,其内含的所有对象引用自动释放、销毁。 
一般来说,不需要定义DESTROY()函数,如果需要,其形式如下: 
sub DESTROY { 
# 
# Add code here. 
# 
}  
因为多种目的,Perl使用了简单的、基于引用的垃圾回收系统。任何对象的引用数目必须大于零,否则该对象的内存就被释放。当程序退出时,Perl的一个彻底的查找并销毁函数进行垃圾回收,进程中的一切被简单地删除。在UNIX类的系统中,这像是多余的,但在内嵌式系统或多线程环境中这确实很必要。 
十、继承 
类方法通过@ISA数组继承,变量的继承必须明确设定。下例创建两个类Bean.pm和Coffee.pm,其中Coffee.pm继承Bean.pm的一些功能。此例演示如何从基类(或称超类)继承实例变量,其方法为调用基类的构造函数并把自己的实例变量加到新对象中。 
Bean.pm代码如下: 
package Bean; 
require Exporter; 
@ISA = qw(Exporter); 
@EXPORT = qw(setBeanType); 
sub new { 
my $type = shift; 
my $this = {}; 
$this->{'Bean'} = 'Colombian'; 
bless $this, $type; 
return $this; 
} 
# 
# This subroutine sets the class name 
sub setBeanType{ 
my ($class, $name) = @_; 
$class->{'Bean'} = $name; 
print "Set bean to $name \n"; 
} 
1;  
此类中,用$this变量设置一个匿名哈希表,将'Bean'类型设为'Colombian'。方法setBeanType()用于改变'Bean'类型,它使用$class引用获得对对象哈希表的访问。 
 |   
 
 
 
 
                     我是一个呼吸着现在的空气而生活在过去的人 
               这样的注定孤独,孤独的身处闹市却犹如置身于荒漠 
                                     我已习惯了孤独,爱上孤独 
                                 他让我看清了自我,还原了自我 
                             让我再静静的沉思中得到快乐和满足 
                                   再孤独的世界里我一遍又一遍 
                                   不厌其烦的改写着自己的过去 
                                             延伸到现在与未来 
                                       然而那只是泡沫般的美梦 
                                 产生的时刻又伴随着破灭的到来 
                         在灰飞烟灭的瞬间我看到的是过程的美丽 
                                      而不是结果的悲哀。。。 
 | 
 
 
 
 |