Linux中国 Linux中国门户站!
设为主页 设为主页
收藏本站 收藏本站
 
当前位置 :首页 ->编程语言 ->CGI ->正文

Perl的面向对象编程

来源:Linuxdby.com 作者:Webmaster 时间:2007-04-28 点击: [收藏] [投稿]

print " { n";
}
#
# This routine declares the main function in a Java script
#
sub closeMain{
print "} n";
}
#
# This subroutine creates the header for the file.
#
sub new {
my $this = {};
print "n /* n ** Created by Cocoa.pm n ** Use at own risk n */ n";
bless $this;
return $this;
}

1;

现在,我们写一个简单的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引用获得对对象哈希表的访问。
Coffee.pm代码如下:

1 #
2 # The Coffee.pm file to illustrate inheritance.
3 #
4 package Coffee;
5 require Exporter;
6 require Bean;
7 @ISA = qw(Exporter, Bean);
8 @EXPORT = qw(setImports, declareMain, closeMain);
9 #
10 # set item
11 #
12 sub setCoffeeType{
13 my ($class,$name) = @_;
14 $class->{"Coffee"} = $name;
15 print "Set coffee type to $name n";
16 }
17 #
18 # constructor
19 #
20 sub new {
21 my $type = shift;
22 my $this = Bean->new(); ##### <- LOOK HERE!!! ####
23 $this->{"Coffee"} = "Instant"; # unless told otherwise
24 bless $this, $type;
25 return $this;
26 }
27 1;

第6行的require Bean;语句包含了Bean.pm文件和所有相关函数,方法setCoffeeType()用于设置局域变量$class->{"Coffee"}的值。在构造函数new()中,$this指向Bean.pm返回的匿名哈希表的指针,而不是在本地创建一个,下面两个语句分别为创建不同的哈希表从而与Bean.pm构造函数创建的哈希表无关的情况和继承的情况:
my $this = {}; #非继承
my $this = $theSuperClass->new(); #继承
下面代码演示如何调用继承的方法:


 如果您对本文有任何疑问或者建议,请到讨论区发表您的意见: >> 论坛入口 <<



上一篇:实战 FastCGI   下一篇:Perl 新手必读

文章评论】 【收藏本文】 【推荐好友】 【打印本文】 【我要投稿】 【论坛讨论
更多相关文章
Power by linux-cn.com 粤ICP备05006655号