Delphi自定義類


 類的聲明
  
  有兩種聲明辦法
  
  一、自定義類的父類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,且要提供一些相關的讀寫方法


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM