亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? 第十三章 perl的面向對象編程.htm

?? perl5教程
?? HTM
?? 第 1 頁 / 共 2 頁
字號:
Cocoa::closeMain($cup);
</blockquote>
&nbsp;&nbsp;&nbsp;&nbsp;其運行結果如下:
<blockquote>
 /*<br>
 ** Created by Cocoa.pm<br>
 ** Use at own risk <br>
 */<br>
 import java.io.InputStream;<br>
 import java.net.*;<br>
<br>
 public class Msg extends java.applet.Applet implements Runnable {<br>
 }
</blockquote>
&nbsp;&nbsp;&nbsp;&nbsp;注意:如果用->操作符調用方法(也叫間接調用),參數必須用括號括起來,如:$cup->setImports( 'java.io.InputStream', 'java.net.*');而雙冒號調用如:Cocoa::setImports($cup,  'java.io.InputStream', 'java.net.*');也可去掉括號寫成:Cocoa::setImports $cup,  'java.io.InputStream', 'java.net.*' ;<br>
<a name="8">八、重載</a><br>
&nbsp;&nbsp;&nbsp;&nbsp;有時需要指定使用哪個類的方法,如兩個不同的類有同名方法的時候。假設類Espresso和Qava都定義了方法grind,可以用::操作符指定使用Qava的方法:<br>
&nbsp;&nbsp;&nbsp;&nbsp;$mess = Qava::grind("whole","lotta","bags");<br>
&nbsp;&nbsp;&nbsp;&nbsp;Qava::grind($mess, "whole","lotta","bags");<br>
&nbsp;&nbsp;&nbsp;&nbsp;可以根據程序的運行情況來選擇使用哪個類的方法,這可以通過使用符號引用去調用來實現:<br>
&nbsp;&nbsp;&nbsp;&nbsp;$method = $local ? "Qava::" : "Espresso::";<br>
&nbsp;&nbsp;&nbsp;&nbsp;$cup->{$method}grind(@args);<br>
<a name="9">九、析構函數</a><br>
&nbsp;&nbsp;&nbsp;&nbsp;Perl跟蹤對象的鏈接數目,當某對象的最后一個應用釋放到內存池時,該對象就自動銷毀。對象的析構發生在代碼停止后,腳本將要結束時。對于全局變量而言,析構發生在最后一行代碼運行之后。<br>
&nbsp;&nbsp;&nbsp;&nbsp;如果你想在對象被釋放之前獲取控制權,可以定義DESTROY()方法。DESTROY()在對象將釋放前被調用,使你可以做一些清理工作。DESTROY()函數不自動調用其它DESTROY()函數,Perl不做內置的析構工作。如果構造函數從基類多次bless,DESTROY()可能需要調用其它類的DESTROY()函數。當一個對象被釋放時,其內含的所有對象引用自動釋放、銷毀。<br>
&nbsp;&nbsp;&nbsp;&nbsp;一般來說,不需要定義DESTROY()函數,如果需要,其形式如下:<br>
<blockquote>
sub DESTROY {<br>
#<br>
# Add code here.<br>
#<br>
}
</blockquote>
&nbsp;&nbsp;&nbsp;&nbsp;因為多種目的,Perl使用了簡單的、基于引用的垃圾回收系統。任何對象的引用數目必須大于零,否則該對象的內存就被釋放。當程序退出時,Perl的一個徹底的查找并銷毀函數進行垃圾回收,進程中的一切被簡單地刪除。在UNIX類的系統中,這像是多余的,但在內嵌式系統或多線程環境中這確實很必要。<br>
<a name="10">十、繼承</a><br>
&nbsp;&nbsp;&nbsp;&nbsp;類方法通過@ISA數組繼承,變量的繼承必須明確設定。下例創建兩個類Bean.pm和Coffee.pm,其中Coffee.pm繼承Bean.pm的一些功能。此例演示如何從基類(或稱超類)繼承實例變量,其方法為調用基類的構造函數并把自己的實例變量加到新對象中。<br>
&nbsp;&nbsp;&nbsp;&nbsp;Bean.pm代碼如下:<br>
<blockquote>
package Bean;<br>
require Exporter;<br>
@ISA = qw(Exporter);<br>
@EXPORT = qw(setBeanType);<br>
<br>
sub new {<br>
 &nbsp;   my $type = shift;<br>
 &nbsp;   my $this = {};<br>
 &nbsp;   $this->{'Bean'} = 'Colombian';<br>
 &nbsp;   bless $this, $type;<br>
 &nbsp;   return $this;<br>
}<br>
<br>    
#<br>
# This subroutine sets the class name<br>
sub setBeanType{<br>
 &nbsp;   my ($class, $name) =  @_;<br>
 &nbsp;   $class->{'Bean'} = $name;<br>
 &nbsp;   print "Set bean to $name \n";<br>    
}<br>
1;
</blockquote>
&nbsp;&nbsp;&nbsp;&nbsp;此類中,用$this變量設置一個匿名哈希表,將'Bean'類型設為'Colombian'。方法setBeanType()用于改變'Bean'類型,它使用$class引用獲得對對象哈希表的訪問。<br>
&nbsp;&nbsp;&nbsp;&nbsp;Coffee.pm代碼如下:<br>
<blockquote>
1&nbsp;  #<br>
2&nbsp;  # The Coffee.pm file to illustrate inheritance.<br>
3&nbsp;  #<br>
4&nbsp;  package Coffee;<br>
5&nbsp;  require Exporter;<br>
6&nbsp;  require Bean;<br>
7&nbsp;  @ISA = qw(Exporter, Bean);<br>
8&nbsp;  @EXPORT = qw(setImports, declareMain, closeMain);<br>
9&nbsp;  #<br>
10 # set item<br>
11 #<br>
12 sub setCoffeeType{<br>
13 &nbsp;    my ($class,$name) =  @_;<br>
14 &nbsp;    $class->{'Coffee'} = $name;<br>
15 &nbsp;    print "Set coffee type to $name \n";<br>
16 &nbsp;    }<br>
17  #<br>
18  #  constructor<br>
19  #<br>
20  sub new {<br>
21 &nbsp;     my $type  = shift;<br>
22 &nbsp;      my $this  = Bean->new();     ##### <- LOOK HERE!!! ####<br>
23 &nbsp;     $this->{'Coffee'} = 'Instant';  # unless told otherwise<br>
24 &nbsp;     bless $this, $type;<br>
25 &nbsp;     return $this;<br>
26 &nbsp;     }<br>
27  1;
</blockquote>
&nbsp;&nbsp;&nbsp;&nbsp;第6行的require Bean;語句包含了Bean.pm文件和所有相關函數,方法setCoffeeType()用于設置局域變量$class->{'Coffee'}的值。在構造函數new()中,$this指向Bean.pm返回的匿名哈希表的指針,而不是在本地創建一個,下面兩個語句分別為創建不同的哈希表從而與Bean.pm構造函數創建的哈希表無關的情況和繼承的情況:<br>
&nbsp;&nbsp;&nbsp;&nbsp;my $this = {}; #非繼承<br>
&nbsp;&nbsp;&nbsp;&nbsp;my $this = $theSuperClass->new(); #繼承<br>
&nbsp;&nbsp;&nbsp;&nbsp;下面代碼演示如何調用繼承的方法:<br>
<blockquote>
1&nbsp;   #!/usr/bin/perl<br>
2&nbsp;   push (@INC,'pwd');<br>
3&nbsp;   use Coffee;<br>
4&nbsp;   $cup = new Coffee;<br>
5&nbsp;   print "\n -------------------- Initial values ------------ \n";<br>
6&nbsp;   print "Coffee: $cup->{'Coffee'} \n";<br>
7&nbsp;   print "Bean: $cup->{'Bean'} \n";<br>
8&nbsp;   print "\n -------------------- Change Bean Type ---------- \n";<br>
9&nbsp;   $cup->setBeanType('Mixed');<br>
10  print "Bean Type is now $cup->{'Bean'} \n";<br>
11  print "\n ------------------ Change Coffee Type ---------- \n";<br>
12  $cup->setCoffeeType('Instant');<br>
13  print "Type of coffee: $cup->{'Coffee'} \n";
</blockquote>
&nbsp;&nbsp;&nbsp;&nbsp;該代碼的結果輸出如下:<br>
<blockquote>
 -------------------- Initial values ------------<br>
 Coffee: Instant<br>
 Bean: Colombian<br>
 -------------------- Change Bean Type ----------<br>
 Set bean to Mixed<br>
 Bean Type is now Mixed <br>
 ------------------ Change Coffee Type ----------<br>
 Set coffee type to Instant<br>
 Type of coffee: Instant
</blockquote>
&nbsp;&nbsp;&nbsp;&nbsp;上述代碼中,先輸出對象創建時哈希表中索引為'Bean'和'Coffee'的值,然后調用各成員函數改變值后再輸出。<br>
&nbsp;&nbsp;&nbsp;&nbsp;方法可以有多個參數,現在向Coffee.pm模塊增加函數makeCup(),代碼如下:<br>
<blockquote>
sub makeCup {<br>
 &nbsp;   my ($class, $cream, $sugar, $dope) = @_;<br>
 &nbsp;   print "\n================================== \n";    <br>
 &nbsp;   print "Making a cup \n";<br>
 &nbsp;   print "Add cream \n" if ($cream);<br>
 &nbsp;   print "Add $sugar sugar cubes\n" if ($sugar);<br>
 &nbsp;   print "Making some really addictive coffee ;-) \n" if ($dope);<br>
 &nbsp;   print "================================== \n";<br>
}
</blockquote>
&nbsp;&nbsp;&nbsp;&nbsp;此函數可有三個參數,不同數目、值的參數產生不同的結果,例如:<br>
<blockquote>
1&nbsp;   #!/usr/bin/perl<br>
2&nbsp;   push (@INC,'pwd');<br>
3&nbsp;   use Coffee;<br>
4&nbsp;   $cup = new Coffee;<br>
5&nbsp;   #<br>
6&nbsp;   #  With no parameters<br>
7&nbsp;   #<br>
8&nbsp;   print "\n Calling  with no parameters: \n";<br>
9&nbsp;   $cup->makeCup;<br>
10  #<br>
11  #  With one parameter<br>
12  #<br>
13  print "\n Calling  with one parameter: \n";<br>
14  $cup->makeCup('1');<br>
15  #<br>
16  #  With two parameters<br>
17  #<br>
18  print "\n Calling  with two parameters: \n";<br>
19  $cup->makeCup(1,'2');<br>
20  #<br>
21  #  With all three parameters<br>
22  #<br>
23  print "\n Calling  with three parameters: \n";<br>
24  $cup->makeCup('1',3,'1');
</blockquote>
&nbsp;&nbsp;&nbsp;&nbsp;其結果輸出如下:<br>
<blockquote>
 Calling  with no parameters:<br>
==================================<br>
Making a cup<br>
==================================<br>
 Calling  with one parameter:<br>
==================================<br>
Making a cup<br>
Add cream<br>
==================================<br>
 Calling  with two parameters:<br>
==================================<br>
Making a cup<br>
Add cream<br>
Add 2 sugar cubes<br>
==================================<br>
 Calling  with three parameters:<br>
==================================<br>
Making a cup<br>
Add cream<br>
Add 3 sugar cubes<br>
Making some really addictive coffee ;-)<br>
==================================
</blockquote>
&nbsp;&nbsp;&nbsp;&nbsp;在此例中,函數makeCup()的參數既可為字符串也可為整數,處理結果相同,你也可以把這兩種類型的數據處理區分開。在對參數的處理中,可以設置缺省的值,也可以根據實際輸入參數值的個數給予不同處理。<br>
<a name="11">十一、子類方法的重載</a><br>
&nbsp;&nbsp;&nbsp;&nbsp;繼承的好處在于可以獲得基類輸出的方法的功能,而有時需要對基類的方法重載以獲得更具體或不同的功能。下面在Bean.pm類中加入方法printType(),代碼如下:<br>
<blockquote>
sub printType {<br>
 &nbsp;   my $class =  shift @_;<br>
 &nbsp;   print "The type of Bean is $class->{'Bean'} \n";<br>
}
</blockquote>
&nbsp;&nbsp;&nbsp;&nbsp;然后更新其@EXPORT數組來輸出:<br>
&nbsp;&nbsp;&nbsp;&nbsp;@EXPORT = qw ( setBeanType , printType );<br>
&nbsp;&nbsp;&nbsp;&nbsp;現在來調用函數printType(),有三種調用方法:<br>
<blockquote>
$cup->Coffee::printType();<br>
$cup->printType();<br>
$cup->Bean::printType();
</blockquote>
&nbsp;&nbsp;&nbsp;&nbsp;輸出分別如下:<br>
<blockquote>
The type of Bean is Mixed<br>
The type of Bean is Mixed<br>
The type of Bean is Mixed
</blockquote>
&nbsp;&nbsp;&nbsp;&nbsp;為什么都一樣呢?因為在子類中沒有定義函數printType(),所以實際均調用了基類中的方法。如果想使子類有其自己的printType()函數,必須在Coffee.pm類中加以定義:<br>
<blockquote>
#<br>
# This routine prints the type of $class->{'Coffee'}<br>
#<br>
sub printType {<br>
 &nbsp;   my $class =  shift @_;<br>
 &nbsp;   print "The type of Coffee is $class->{'Coffee'} \n";<br>
}
</blockquote>
&nbsp;&nbsp;&nbsp;&nbsp;然后更新其@EXPORT數組:<br>
&nbsp;&nbsp;&nbsp;&nbsp;@EXPORT = qw(setImports, declareMain, closeMain, printType);<br>
&nbsp;&nbsp;&nbsp;&nbsp;現在輸出結果變成了:<br>
<blockquote>
The type of Coffee is Instant<br>
The type of Coffee is Instant<br>
The type of Bean is Mixed
</blockquote>
&nbsp;&nbsp;&nbsp;&nbsp;現在只有當給定了Bean::時才調用基類的方法,否則直接調用子類的方法。<br>
&nbsp;&nbsp;&nbsp;&nbsp;那么如果不知道基類名該如何調用基類方法呢?方法是使用偽類保留字SUPER::。在類方法內使用語法如:$this->SUPER::function(...argument list...); ,它將從@ISA列表中尋找。剛才的語句用SUPER::替換Bean::可以寫為$cup->SUPER::printType(); ,其結果輸出相同,為:<br>
<blockquote>The type of Bean is Mixed</blockquote>
 十二、Perl類和對象的一些注釋<br>
&nbsp;&nbsp;&nbsp;&nbsp;OOP的最大好處就是代碼重用。OOP用數據封裝來隱藏一些復雜的代碼,Perl的包和模塊通過my函數提供數據封裝功能,但是Perl并不保證子類一定不會直接訪問基類的變量,這確實減少了數據封裝的好處,雖然這種動作是可以做到的,但卻是個很壞的編程風格。<br>
注意:<blockquote>1、一定要通過方法來訪問類變量。<br>2、一定不要從模塊外部直接訪問類變量。</blockquote>
&nbsp;&nbsp;&nbsp;&nbsp;當編寫包時,應該保證方法所需的條件已具備或通過參數傳遞給它。在包內部,應保證對全局變量的訪問只用通過方法傳遞的引用來訪問。對于方法要使用的靜態或全局數據,應該在基類中用local()來定義,子類通過調用基類來獲取。有時,子類可能需要改變這種數據,這時,基類可能就不知道怎樣去尋找新的數據,因此,這時最好定義對該數據的引用,子類和基類都通過引用來改變該數據。<br>
&nbsp;&nbsp;&nbsp;&nbsp;最后,你將看到如下方式來使用對象和類:<br>
&nbsp;&nbsp;&nbsp;&nbsp;use coffee::Bean;<br>
&nbsp;&nbsp;&nbsp;&nbsp;這句語句的含義是“在@INC數組所有目錄的Coffee子目錄來尋找Bean.pm”。如果把Bean.pm移到./Coffee目錄,上面的例子將用這一use語句來工作。這樣的好處是有條理地組織類的代碼。再如,下面的語句:<br>
&nbsp;&nbsp;&nbsp;&nbsp;use Another::Sub::Menu;<br>
&nbsp;&nbsp;&nbsp;&nbsp;意味著如下子目錄樹:<br>
&nbsp;&nbsp;&nbsp;&nbsp;./Another/Sub/Menu.pm<br>


<p align="center"><a href="第十二章 Perl5中的引用(指針).htm">上一章</a> <a href="第十四章 Perl5的包和模塊.htm">下一章</a> <a href="index.htm">目錄</a></p>
<br>
</body>
</html>

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产福利一区二区| 久久午夜电影网| 国产欧美一区二区在线| 中文字幕一区二区三区在线播放 | 欧美一二三区在线| 最新中文字幕一区二区三区| 久久成人羞羞网站| 欧美日韩亚洲丝袜制服| 国产精品进线69影院| 精品一区二区三区久久| 欧美日韩久久一区二区| 中文字幕制服丝袜一区二区三区| 裸体在线国模精品偷拍| 欧美日韩卡一卡二| 一区二区三区在线免费观看| 成人午夜av影视| 精品国产91久久久久久久妲己 | 夜夜精品视频一区二区| caoporm超碰国产精品| 国产欧美日韩另类视频免费观看| 久久不见久久见免费视频1| 欧美丰满美乳xxx高潮www| 亚洲午夜三级在线| 在线视频欧美区| 一区二区欧美国产| 欧美私人免费视频| 亚洲一卡二卡三卡四卡无卡久久| 99久久久国产精品| 亚洲日本丝袜连裤袜办公室| av电影在线观看一区| 国产精品久久二区二区| 91原创在线视频| 亚洲色图自拍偷拍美腿丝袜制服诱惑麻豆 | 26uuu色噜噜精品一区二区| 亚洲午夜私人影院| 99视频一区二区三区| 日本一区二区三级电影在线观看| 蜜臀精品一区二区三区在线观看| 欧美亚洲动漫另类| 亚洲欧美日韩在线播放| 色综合久久天天| 最近中文字幕一区二区三区| 石原莉奈在线亚洲二区| 91传媒视频在线播放| 午夜亚洲国产au精品一区二区| 欧美日韩在线亚洲一区蜜芽| 一区av在线播放| 在线观看日韩毛片| 一区二区激情视频| 欧美视频在线不卡| 天堂一区二区在线| 日韩一卡二卡三卡| 美女视频免费一区| 亚洲精品在线观| 国产精品主播直播| 国产精品乱人伦中文| 91在线看国产| 亚洲午夜激情网页| 欧美日韩一区小说| 亚洲gay无套男同| 欧美一级午夜免费电影| 国产在线国偷精品免费看| 精品国产乱码久久久久久牛牛| 久久99精品一区二区三区三区| 精品国产乱码久久久久久免费| 国产激情精品久久久第一区二区| 久久久久9999亚洲精品| 99久久精品国产麻豆演员表| 一区二区在线观看av| 欧美伦理视频网站| 国产精品小仙女| 一区二区在线观看免费| 日韩一级黄色大片| 精品一区二区三区视频在线观看| 国产精品不卡在线| 4438x成人网最大色成网站| 久久91精品久久久久久秒播| 国产精品久久网站| 欧美日韩激情一区二区三区| 青青国产91久久久久久| 久久久久久久久久久久久女国产乱| 丁香亚洲综合激情啪啪综合| 亚洲一区中文在线| 久久久国产午夜精品| 日本丶国产丶欧美色综合| 日本麻豆一区二区三区视频| 国产欧美视频在线观看| 欧美色爱综合网| 日产精品久久久久久久性色| 久久亚区不卡日本| 精品视频免费在线| 白白色 亚洲乱淫| 爽好多水快深点欧美视频| 欧美激情在线看| 这里只有精品免费| 91丨九色丨蝌蚪丨老版| 久久精品国产澳门| 亚洲一二三专区| 中文av字幕一区| 亚洲精品在线观看视频| 在线免费一区三区| 国产精品影视在线观看| 免费的成人av| 亚洲福利视频一区二区| 亚洲欧洲日本在线| 久久影视一区二区| 6080国产精品一区二区| 欧美日韩亚洲综合| 一本大道久久a久久精品综合| 韩国女主播成人在线观看| 日韩av在线免费观看不卡| 一二三四区精品视频| 亚洲免费观看高清| 国产精品久久久久精k8| 国产亚洲精品中文字幕| 精品国产成人系列| 精品入口麻豆88视频| 91精品一区二区三区久久久久久 | 亚洲一区二区三区国产| 亚洲欧美日韩中文播放| 久久综合丝袜日本网| 久久影院午夜片一区| 欧美午夜寂寞影院| 91福利国产成人精品照片| 91在线视频免费观看| gogo大胆日本视频一区| 国产一区高清在线| 成人精品国产福利| www.日韩在线| 91麻豆免费视频| 91影院在线免费观看| 99热国产精品| 一本久道久久综合中文字幕 | 韩国av一区二区| 久久99精品国产91久久来源| 久久成人18免费观看| 激情综合五月婷婷| 国产精华液一区二区三区| 国产成人av一区| 成人精品鲁一区一区二区| 丰满亚洲少妇av| 99久久婷婷国产综合精品| 91亚洲精品一区二区乱码| 色先锋资源久久综合| 91碰在线视频| 日韩欧美中文字幕公布| 久久嫩草精品久久久久| 国产欧美一区二区精品久导航| 国产日本欧美一区二区| 亚洲色图都市小说| 亚洲天堂精品在线观看| 亚洲欧美视频在线观看视频| 亚洲一区二区三区四区在线观看| 亚洲1区2区3区视频| 久久精品国产亚洲高清剧情介绍| 国产精品亚洲一区二区三区妖精| av亚洲产国偷v产偷v自拍| 欧美三级电影一区| 精品国产乱码久久久久久久| 久久久综合视频| 国产精品高潮呻吟| 一区二区在线免费观看| 久久精品久久久精品美女| av午夜一区麻豆| 91精品国产91综合久久蜜臀| 久久精品亚洲麻豆av一区二区| 中文字幕一区二区三区色视频| 亚洲va韩国va欧美va| 国产成人h网站| 99这里只有精品| 欧美经典三级视频一区二区三区| 亚洲永久精品大片| 国产麻豆午夜三级精品| 色偷偷久久人人79超碰人人澡| 欧美一区二区国产| 一区二区三区欧美日| 国产一区二区三区四区五区美女 | 美腿丝袜一区二区三区| 91在线观看成人| 久久人人超碰精品| 国产精品电影院| 国产精品99久久久久久宅男| 欧美日韩中文字幕一区二区| 亚洲国产精品传媒在线观看| 免费人成在线不卡| 91久久精品一区二区二区| 国产亚洲欧美日韩日本| 日本特黄久久久高潮| 一本色道a无线码一区v| 日本一区二区免费在线观看视频| 亚洲成人在线观看视频| 国产乱码字幕精品高清av | eeuss鲁片一区二区三区在线看| 日韩欧美一区二区免费| 亚洲国产综合视频在线观看| 国产成人av影院| 久久老女人爱爱| 精品一区二区免费| 制服丝袜亚洲网站| 亚洲美女屁股眼交3|