PB面向對象編程研究(一)

PB面向對象編程研究

1. 前言

衆所周知,PowerBuilder是第四代面向對象開發語言。

面向對象程序設計的根本目的是實現數據的封裝和隱藏。面向對象主要有三大特點,即封裝性、繼承性和多態性。

面向對象的封裝性將數據與函數組織在同一個結構單元中,從而,實現數據和函數的關聯以及數據對結構單元外的隱藏。進而實現結構單元與結構單元之間的弱耦合性。這裏所說的結構單元就是類。

面向對象的繼承性可以理解爲類之間的遺傳和變異。子類具有父類的性質同時又有區別於父類的性質,無論是屬性還是方法。

面向對象的多態性實現的根本基礎是類繼承性背後的ISA關係。一個基類以及其所有派生類之間都存在ISA關係,他們的類型都屬於基類類型。在實際使用中,根據對象實際的類型程序可以實現動態的方法調用。

本文主要敘述PowerBuilder面向對象的實現和特性。

 

2. 封裝性

2.1. 對象

類,在PowerBuilder集成開發環境中,被稱爲對象Object)。在編程過程中,我們所定義的對象變量被稱爲該對象的一個實例(Instance。本文按照PB的習慣將類稱爲對象,將類的變量稱爲實例。

所謂的對象,我們可以認爲是世間萬物中任何一樣東西,這件東西具有這樣或者那樣的特性,同時,這件東西還具有各種不同的行爲。所謂的特性和行爲就是我們在開發時我們所定義的數據和處理數據的函數。在面向對象的設計中,數據成員又稱爲屬性,函數又稱爲方法。

2.2. 屬性

屬性即對象的特性,是編程過程中我們要處理的數據。在PB中,屬性的表現形式爲對象的實例變量instance variable。屬性一般有三種訪問權限(access right),即:

Public公共

Protected保護

Private私有

公共訪問權限指不僅對象內部方法可以直接訪問該屬性,對象外部的代碼也可以直接該屬性,就像我們在C/C++中使用結構體數據成員一樣;保護的訪問權限指對於外部代碼該屬性是受保護的,不允許訪問,對於對象本身以及對象的後續繼承對象都是公開的,可以直接訪問該屬性;私有訪問屬性是指不僅不允許外部代碼訪問該屬性,該對象的後續繼承對象也不能訪問該屬性,該屬性爲本對象的私有數據,只有對象本身可以訪問。從這三種訪問權限來看,似乎我們不應該定義屬性的Public訪問權限,因爲,它違反了數據的封裝和隱藏特性,我們應該定義Protected或者Private訪問權限的屬性,爲了滿足外部對特性的訪問,我們只需要爲該屬性實現特定的訪問方法。

下面幾小節通過具體例子來體會一下屬性訪問以及初始化。

2.2.1. 訪問權限

首先,我們演示在對象外部訪問各種不同權限的屬性。具體演示步驟如下圖。我們創建一個uo_test自定義類的對象。

 

uo_test的變量聲明窗口中聲明如下圖變量。

 

接下來,我們在Applicationopen事件中創建一個uo_test對象uo_test_1的實例,然後分別訪問三個實例變量。如下圖。

 

保存時PB提示我們發現錯誤:沒有足夠權限訪問類uo_test的屬性。

 

其次,我們演示在對象的派生對象中訪問不同權限的屬性。由於目前還沒有涉及到如何實現繼承,所以以下演示省略了派生的過程。

在下圖中,我們可以從標題看出uo_test_inherited是從uo_test繼承過來的。

 

在這個演示部分,我們發現,PBPrivate訪問權限上與C++有所不同,雖然,PB禁止在派生類中訪問Private權限的屬性,但是PB的錯誤提示是:沒有定義的變量。那麼,是不是我們可以在派生類中定一個和基類中一樣的屬性ii_private呢?答案是否定的,PB認爲在派生類中定義的這個試圖覆蓋基類的Private屬性的變量在名字上是衝突的。如下圖所示。

 

看上去很令人奇怪,提示沒有定義,定義了又提示衝突,有些矛盾!而C++中的提示很明確,

如下圖所示:

 

2.2.2. 可視初始化

創建一個窗口,將uo_test拖放到窗口中,查看non-visual object list窗口中uo_test_1的屬性,可以看到ii_publicii_protected兩個屬性。這足以證明PB將實例變量作爲面向對象的屬性來使用的。因此,我們在PB中可以實現在可視化屬性窗口中實現對象的屬性初始化。如下圖。

 

可能有些朋友會有疑問,爲什麼沒有ii_private?大家可以從屬性窗口的標題看出來,uo_test_1是從uo_test繼承而來,所以,uo_test_1是不能訪問ii_private屬性的。所以,可視初始化僅針對PublicProtected訪問權限的屬性而言。

2.2.3. 私有屬性初始化

那麼私有屬性該怎麼初始化,那就是在基類中。

 

2.3. 方法

方法即對象的行爲,是用來處理對象屬性的函數。方法與屬性一樣,具有三種訪問權限:PublicProtectedPrivate。方法可以有參數也可以沒有參數,可以有返回值也可以沒有返回值。

2.3.1. 參數

uo_test對象中添加一個方法func,增加一個參數,如下圖:

 

圖中1是傳遞方式,2是參數類型,3是參數名。

傳遞方式有有三種,如下圖。

 

value表示傳值方式,reference表示引用方式,readonly表示只讀方式。一個好的方法設計,應該根據方法的實際情況選擇參數的傳遞方式。選擇value方式:當參數僅爲傳入的時候,但是在方法運行過程中需要改變該參數,例如傳入一個參數表示方法中某個循環次數,修改參數做遞減;選擇reference方式:當參數爲傳出的時候,例如,方法利用該類型的參數作爲方法的部分返回信息;選擇readonly方式:參數僅爲傳入,並且在方法體內不做任何變化。選擇合適的傳值方式有助於正確編寫和使用對象的方法(適用於普遍函數),即,從傳值方式我們就能夠知道該參數大致的操作性質,從而正確編寫和使用。對於用戶自定義類型比如結構體和類等的聚集類型,爲了提高程序的性能,不建議使用value的傳值方式。

參數類型有很多,點擊右邊的下拉鍵頭就可以看到。同時,這個類型也可以使用用戶自定義的數據類型,包括結構體、類等等,只需要將類型名字填入“Argument Type”即可。

參數名是方法體內使用的變量名,該變量通常稱爲形式參數。有時候,我們需要傳遞一個數組到方法中,那麼我們可以在定義變量時在變量名後加上“[]”表示定義的參數爲數組類型。在調用的過程中,將數組的名字傳入即可。有時我們會看到有些人在調用這樣的方法時將“[]”一併傳入,從我的經驗來說,這種調用方法有時會導致程序非法,所以,我個人不主張在調用方法是傳入“[]”。

2.3.2. 返回值

選擇合適的返回值類型。點擊“Return Type”的下拉鍵頭,我們可以選擇需要的返回值類型,當然,我們也可以選擇none(沒有返回值)!當我們需要返回自定義數據類型時,可以將類型名稱填入“Return Type”,方法就可以返回我們自定義的類型了!

 

2.3.3. 方法的調用

方法的調用也是有權限的,這一點和屬性的權限類似。也分爲:PublicProtectedPrivate三種。Public權限:類外部可以調用,類的子類也可以調用;Protected權限:類的外部不可以調用,類的子類可以調用;Private權限:類的外部部可以調用,類的子類也不可以調用,僅類的本身可以調用。

 

一個好的設計,應該選擇合適的方法訪問權限,有助於方法的正確使用,對於沒有必要提供給外界的接口,要隱藏到類中。

創建func函數形如:

 

2.4. 事件

事件,PB將事件作爲一個特性引入了面向對象編程的概念,指出一個對象在某種情況下應該做出什麼樣的反應和處理。例如,一個人在捱了另一個人一巴掌後應該怎麼做?當然,人挨巴掌的時候是不能確定的,這一點正是事件的最根本特性,發生的不確定性。究竟在挨巴掌後是給予反擊還是退縮就要看這個事件處理程序如何編寫了。

PB中最典型的兩個事件就是構造器和析構器。構造器在這一點與C++編程語言有着本質的不同。雖然C++中的構造函數都是被系統在一定時機調用(類似事件),但是,C++中可以編寫各種各樣特定的構造函數,而PB中爲規定好的接口樣式的構造器事件。

2.4.1. 構造器

構造器事件在對象創建的瞬間被調用,其功能是初始化對象屬性,以及對象被創建後需要執行的方法。

 

2.4.2. 析構器

析構器事件在對象被銷燬的瞬間被調用,其功能是釋放對象使用的資源等的收尾工作。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章