類的聲明
有兩種聲明辦法
一、自定義類的父類delphi內建類
type 類名 = class(父類)
成員表達式
end;
(1)保留字Class說明該類是dephi內建類,將繼承父類的屬性和方法
(2)“父類”默認是delphi的祖先類Tobject
二、完全自定義的類
Type 類名 = object(父類)
成員表達式
End;
(1) 保留字object說明該類是完全自定義的類
(2) 自類也必須是完全自義的類
注意:用class自定義的類必須遵循delphi內建類的Tobject的特定的構造方法和析構方法,而用object自定義類的方法無此限制(內存管理方式),所以用第一種方法生成對象時必須調用Create構造函數,
第二種就不需要,可直接生成對象,它將做為一般變量,和記錄(Record)變量相同,用到
時立即分配內存,用完時自動釋放內存
自定義Delphi內建類的構造和析構
構造函數
Constructor Create(AOwner :Tcomponent) ;override ;
(1)可以根據實際情況改變參數信息(參數個類,類型,順序,默認值)
(2)若要繼承父類的構造函數,可添加inherited create;
析構函數
Destructor destroy ; override ;
(1) 若在自定類中添加了其它類,一定要記得釋放這些對象
(2) 若要繼承父類
(3)值得注意的中destroy中刪除對象的變量,即對象的參考,未真正刪除對象實體,也就沒有釋放對象所占的內存,另外,若在沒有調用create 的情況下,該對象參考的值為nil,這種情況下調用destroy,會產生錯誤
用Free可解決上面的問題(真正釋放內存;在沒有創建的對象的情況下調用Free也不會報錯)
還有一個更實用的FreeAndNIl(對象),它不僅釋放內存,而且將對象的參考(變量)賦nil值
完全自定義類的構造和析構
自定類也完全可以自己編碼自己的構造和析構函數,為其分配內存、釋放內存,不免要用到指針,是復雜度很高的工程,此時還是用的自定義的Class比較方便。
類的封裝
封裝的含義:把個別單元(對象和類)的所有數據和功能(成員變量、成員函數、屬性)全部包括它的內部。
封裝的目的:防止外界去破壞對象內部結構和數據。只有通過對象對外的接口,才能訪問對象內部的數據,對象之間也無法直接訪問彼此的數據,必須通過某些信息的傳遞,而這些信息對調用、執行對象內部的方法,或訪問對象內部的屬性或字段。
封裝的方式:delphi中用類(Class)的聲明技術。接口部分(interface)用來定義對象外觀及對象對外表現的行為,而實現部分(implementation)則用來處理對象內部運行,其內容包括不公開的字段、方法,甚至屬性。
ObjectPascal封裝的級別
五個級別
Private
(1)這里聲明的類成員(包括字段、方法(類方法))只能在類聲明的單元內使用。
(2)子類可以繼續父類的private成員,但無法使用這些成員
該部分聲明的方法為類方法,也就是說對象無法直接調用
Protected
(1)這里聲明的類成員(包括字段、方法(類方法))只能在類聲明的單元內使用
(2)子類可以繼承父類的protected成員,也可以使用,但也只限於類定義的單元
該部分聲明的方法同樣為類方法,類的對象也無法直接調用
Public
(1)這里聲明的類成員(包括字段、方法(對象方法))可見度最大,可以在類單元及類對象所在的任何單元使用。
Published
(1) 可見度與public一樣,
(2) 與public的區別是本區域的成員可以在delphi對象檢查器中出現,而此差別來自RTTI機制
RTTI(Run time type Information)是為Published制作它允許應用程序動態查詢該類的published的字段、屬性(包括屬性和事件),並且加載類的方法
RTTI啟動條件是有條件的——使“{$M+}”編譯指令的狀態下才能啟動RTTI或它的祖先類以上述狀態編譯,也可以啟動RTTI,然后該類檢查器才能顯示在檢查器中。
(3) 除了RTTI條件限制后,published的屬性也有類型限制
A.序數、字符串(string)、class、interface以及mothod—pointer類,都可以做published的屬性
B. 范圍在0-31之間的集合,該集合值必須滿足byte、word或double word類才能做published屬性
C. 除了Real類外的所有實數類,都可以做為published屬性
D.數組類不可以做published屬性
E. 所有的成員函數都可以作為published的事件,然而重載override的函數不可以作為published事件
F. 字段Fieled不能作為Published的屬性,除非它屬於class或interface類
Automated
(1) 可見度與Public成員一樣
(2) 與public差別和public與published差別相似,當我們使用自動化服務器(Automation server)時,“Automation Type information”是為auomated成員設置。而所有的Automatic成員只能出現在OleAuto單元,繼承自TAutoObject的類里面,且OleAuto單元原本就有默認的Automated區,至於comObj單元,則無法具有Automated
開頭不加保留字的類成員
這里講的開頭不加保留的類成員兩種情況
一、 在private 、protected 、public 、published所屬區域,非第一個類成員可以不加這些保留字(省略)
二、 若類的成員不些這個上述四個范圍之內,像在類的開頭部分有幾個沒有保留字的類成員,它的所屬情況分兩種:
A. 該類或你類使用了“{$M+}”編譯指令的情況下,默認為published成員
B. 該類或你類未使用“{$M+}”編譯指令的情況下,默認為public成員
成員封閉等級的變更法則
變更方法:只需要在子類成員的聲明區重新聲明即可
遵循法則:可擴大該成員的可見度,但不要縮小成員的可見度。
因為縮小某些成員可見度使某些成員可見度降低,有可能困這些成員無法訪問而導致編譯錯誤
類成員的定義和實現
類成員
字段、方法、屬性
字段與對象引用的實現
字段:指狹義上的字段——指對象還擁有的成員變量。
(1) 成員變量的封裝通常在private這個等級
(2) 成員變量的定義必須早於任何屬性或方法的定義
(3) 成員變量的類型沒有限制
倘若成員變量屬於class類,則此種情況我們稱該成員變量為“對象引用”
方法
(1) 類名.方法名
屬性
與字段的區別;
(1) 字段只是一個保留數據的空間,屬性可以被訪問,進行一些讀寫操作
(2) 屬性需要加上保留字property,且要提供一些相關的讀寫方法