歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Unix知識 >> 關於Unix >> Perl的面向對象編程(OOP)

Perl的面向對象編程(OOP)

日期:2017/3/6 15:22:33   编辑:關於Unix
介紹如何使用Perl的面向對象編程(OOP)特性及如何構建對象,還包括繼承、方法重載和數據封裝等內容。 一、模塊簡介 模塊(module)就是Perl包(pachage)。Perl中的對象基於對包中數據項的引用。(引用見第x章引用)。 詳見 http://www.nease.net/tppmsgs/msgs0.ht 介紹如何使用Perl的面向對象編程(OOP)特性及如何構建對象,還包括繼承、方法重載和數據封裝等內容。

一、模塊簡介
模塊(module)就是Perl包(pachage)。Perl中的對象基於對包中數據項的引用。(引用見第x章引用)。
詳見cc">http://www.nease.net/tppmsgs/msgs0.htm#28的perlmod和perlobj。
在用其它語言進行面向對象編程時,先聲明一個類然後創建該類的對象(實例),特定類所有對象的行為方式是相同的,由類方法確定,可以通過定義新類或從現存類繼承來創建類。已熟悉面向對象編程的人可以在此遇到許多熟悉的術語。Perl一直是一個面向對象的語言,在Perl5中,語法略有變動,更規范化了對象的使用。
下面三個定義對理解對象、類和方法在Perl中如何工作至關重要。
.類是一個Perl包,其中含提供對象方法的類。
.方法是一個Perl子程序,類名是其第一個參數。
.對象是對類中數據項的引用。

二、Perl中的類
再強調一下,一個Perl類是僅是一個包而已。當你看到Perl文檔中提到“類”時,把它看作“包”就行了。Perl5的語法可以創建類,如果你已熟悉C++,那麼大部分語法你已經掌握了。與Perl4不同的概念是用雙冒號(::)來標識基本類和繼承類(子類)。
面向對象的一個重要特性是繼承。Perl中的繼承特性與其它面向對象語言不完全一樣,它只繼承方法,你必須用自己的機制來實現數據的繼承。
因為每個類是一個包,所以它有自己的名字空間及自己的符號名關聯數組(詳見第x章關聯數組),每個類因而可以使用自己的獨立符號名集。與包的引用結合,可以用單引號(\\')操作符來定位類中的變量,類中成員的定位形式如:$class\\'$member。在Perl5中,可用雙冒號替代單引號來獲得引用,如:$class\\'$member與$class::$member相同。

三、創建類。
本節介紹創建一個新類的必要步驟。下面使用的例子是創建一個稱為Cocoa的簡單的類,其功能是輸出一個簡單的Java應用的源碼的必要部分。放心,這個例子不需要你有Java的知識,但也不會使你成為Java專家,其目的是講述創建類的概念。
首先,創建一個名為Cocoa.pm的包文件(擴展名pm是包的缺省擴展名,意為Perl Module)。一個模塊就是一個包,一個包就是一個類。在做其它事之前,先加入“1;”這樣一行,當你增加其它行時,記住保留“1;”為最後一行。這是Perl包的必需條件,否則該包就不會被Perl處理。

四、構造函數
構造函數是類的子程序,它返回與類名相關的一個引用。將類名與引用相結合稱為“祝福”一個對象,因為建立該結合的函數名為bless(),其語法為:
bless YeReference [,classname]
YeReference是對被“祝福”的對象的引用,classname是可選項,指定對象獲取方法的包名,其缺省值為當前包名。
創建一個構建函數的方法為返回已與該類結合的內部結構的引用。如

sub new {
my $this = {}; # Create an anonymous hash, and #self points to it.
bless $this; # Connect the hash to the package Cocoa.
return $this; # Return the reference to the hash.
}

1;

五、方法
Perl類的方法只不過是一個Perl子程序而已,也即通常所說的成員函數。Perl的方法定義不提供任何特殊語法,但規定方法的第一個參數為對象或其被引用的包。Perl有兩種方法:靜態方法和虛方法。
靜態方法第一個參數為類名,虛方法第一個參數為對象的引用。方法處理第一個參數的方式決定了它是靜態的還是虛的。靜態方法一般忽略掉第一個參數,因為它們已經知道自己在哪個類了,構造函數即靜態方法。虛方法通常首先把第一個參數shift到變量self或this中,然後將該值作普通的引用使用。

六、方法的輸出
如果你現在想引用Cocoa.pm包,將會得到編譯錯誤說未找到方法,這是因為Cocoa.pm的方法還沒有輸出。輸出方法需要Exporter模塊,在包的開始部分加上下列兩行:
require Exporter;
@ISA = qw (Exporter);
Perl類的繼承是通過@ISA數組實現的。@ISA數組不需要在任何包中定義,然而,一旦它被定義,Perl就把它看作目錄名的特殊數組。它與@INC數組類似,@INC是包含文件的尋找路徑。@ISA數組含有類(包)名,當一個方法在當前包中未找到時就到@ISA中的包去尋找。@ISA中還含有當前類繼承的基類名。
類中調用的所有方法必須屬於同一個類或@ISA數組定義的基類。如果一個方法在@ISA數組中未找到,Perl就到AUTOLOAD()子程序中尋找,這個可選的子程序在當前包中用sub定義。若使用AUTOLOAD子程序,必須用use Autoload;語句調用autoload.pm包。AUTOLOAD子程序嘗試從已安裝的Perl庫中裝載調用的方法。如果AUTOLOAD也失敗了,Perl再到UNIVERSAL類做最後一次嘗試,如果仍失敗,Perl就生成關於該無法解析函數的錯誤。

七、方法的調用
調用一個對象的方法有兩種方法,一是通過該象的引用(虛方法),一是直接使用類名(靜態方法)。

暫時寫到這裡,下次繼續!

Copyright © Linux教程網 All Rights Reserved