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引用獲得對對象哈希表的訪問。
|