Perl教學(xué)(13)Perl的面向?qū)ο缶幊讨?
發(fā)表時(shí)間:2024-06-11 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]1; 現(xiàn)在,我們寫(xiě)一個(gè)簡(jiǎn)單的Perl腳本來(lái)使用該類(lèi)的方法,下面是創(chuàng)建一個(gè)Java applet源代碼骨架的腳本代碼: #!/usr/bin/perluse Cocoa;$cup = new Cocoa;$cup->setImports( 'java.io.InputStream...
1;
現(xiàn)在,我們寫(xiě)一個(gè)簡(jiǎn)單的Perl腳本來(lái)使用該類(lèi)的方法,下面是創(chuàng)建一個(gè)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();
這段腳本創(chuàng)建了一個(gè)叫做Msg的Java applet,它擴(kuò)展(extend)了java.applet.Applet小應(yīng)用程序并使之可運(yùn)行(runnable),其中最后三行也可以寫(xiě)成如下:
Cocoa::setImports($cup, 'java.io.InputStream', 'java.net.*');
Cocoa::declareMain($cup, "Msg" , "java.applet.Applet", "Runnable");
Cocoa::closeMain($cup);
其運(yùn)行結(jié)果如下:
/*
** Created by Cocoa.pm
** Use at own risk
*/
import java.io.InputStream;
import java.net.*;
public class Msg extends java.applet.Applet implements Runnable {
}
注意:如果用->操作符調(diào)用方法(也叫間接調(diào)用),參數(shù)必須用括號(hào)括起來(lái),如:$cup->setImports( 'java.io.InputStream', 'java.net.*');而雙冒號(hào)調(diào)用如:Cocoa::setImports($cup, 'java.io.InputStream', 'java.net.*');也可去掉括號(hào)寫(xiě)成:Cocoa::setImports $cup, 'java.io.InputStream', 'java.net.*' ;
八、重載
有時(shí)需要指定使用哪個(gè)類(lèi)的方法,如兩個(gè)不同的類(lèi)有同名方法的時(shí)候。假設(shè)類(lèi)Espresso和Qava都定義了方法grind,可以用::操作符指定使用Qava的方法:
$mess = Qava::grind("whole","lotta","bags");
Qava::grind($mess, "whole","lotta","bags");
可以根據(jù)程序的運(yùn)行情況來(lái)選擇使用哪個(gè)類(lèi)的方法,這可以通過(guò)使用符號(hào)引用去調(diào)用來(lái)實(shí)現(xiàn):
$method = $local ? "Qava::" : "Espresso::";
$cup->{$method}grind(@args);
九、析構(gòu)函數(shù)
Perl跟蹤對(duì)象的鏈接數(shù)目,當(dāng)某對(duì)象的最后一個(gè)應(yīng)用釋放到內(nèi)存池時(shí),該對(duì)象就自動(dòng)銷(xiāo)毀。對(duì)象的析構(gòu)發(fā)生在代碼停止后,腳本將要結(jié)束時(shí)。對(duì)于全局變量而言,析構(gòu)發(fā)生在最后一行代碼運(yùn)行之后。
如果你想在對(duì)象被釋放之前獲取控制權(quán),可以定義DESTROY()方法。DESTROY()在對(duì)象將釋放前被調(diào)用,使你可以做一些清理工作。DESTROY()函數(shù)不自動(dòng)調(diào)用其它DESTROY()函數(shù),Perl不做內(nèi)置的析構(gòu)工作。如果構(gòu)造函數(shù)從基類(lèi)多次bless,DESTROY()可能需要調(diào)用其它類(lèi)的DESTROY()函數(shù)。當(dāng)一個(gè)對(duì)象被釋放時(shí),其內(nèi)含的所有對(duì)象引用自動(dòng)釋放、銷(xiāo)毀。
一般來(lái)說(shuō),不需要定義DESTROY()函數(shù),如果需要,其形式如下:
sub DESTROY {
#
# Add code here.
#
}
因?yàn)槎喾N目的,Perl使用了簡(jiǎn)單的、基于引用的垃圾回收系統(tǒng)。任何對(duì)象的引用數(shù)目必須大于零,否則該對(duì)象的內(nèi)存就被釋放。當(dāng)程序退出時(shí),Perl的一個(gè)徹底的查找并銷(xiāo)毀函數(shù)進(jìn)行垃圾回收,進(jìn)程中的一切被簡(jiǎn)單地刪除。在UNIX類(lèi)的系統(tǒng)中,這像是多余的,但在內(nèi)嵌式系統(tǒng)或多線程環(huán)境中這確實(shí)很必要。
十、繼承
類(lèi)方法通過(guò)@ISA數(shù)組繼承,變量的繼承必須明確設(shè)定。下例創(chuàng)建兩個(gè)類(lèi)Bean.pm和Coffee.pm,其中Coffee.pm繼承Bean.pm的一些功能。此例演示如何從基類(lèi)(或稱(chēng)超類(lèi))繼承實(shí)例變量,其方法為調(diào)用基類(lèi)的構(gòu)造函數(shù)并把自己的實(shí)例變量加到新對(duì)象中。
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;
此類(lèi)中,用$this變量設(shè)置一個(gè)匿名哈希表,將'Bean'類(lèi)型設(shè)為'Colombian'。方法setBeanType()用于改變'Bean'類(lèi)型,它使用$class引用獲得對(duì)對(duì)象哈希表的訪問(wèn)。