TObject 對象模型

TObject 對象模型創建步驟
1.分配和初始化內存(內存切換【未開放】)
 1.1:Object Pascal 的對象模型會先初始化所有的內存內容爲0,String 類型爲空字符串
 1.2:爲類中聲明的特別字段進行初始化的工作
2.設定字段變量數據結構
3.設定執行框架

 

Object Pascal 對象模型提供的基礎服務
1.對象創建服務: 提供創建對象機制
  TObject = class
    ...
    constructor Create;
    class function NewInstance: TObject; virtual;           
    class function InitInstance(Instance: Pointer): TObject;
    class function InstanceSize: Longint;
    procedure AfterConstruction; virtual;
    ...   
  end;
  NewInstance 是虛擬方法,功能是爲對象分配內存,並且調用InitInstance 方法爲對象設定對象支持的藉口。
  NewInstance 的返回值是TObject,代表調用了NewInstance之後Object Pascal的對象模型已經在內存形成了
  TObject的實體(instance),此時仍然無發使用,要設定對象的執行框架
 
2.對象釋放服務: 提供對象釋放機制
  TObject = class
     
    procedure CleanupInstance;
    procedure FreeInstance; virtual;
    destructor Destroy; virtual;
    procedure Free;
   
  end;
  
  Destroy 派生類分配的資源釋放需要:
  1.Destroy:在派生類中需要重載(override)
  2.在改寫的Destroy中先釋放派生類自己的資源
  3.最後調用父類的Inherited 關鍵字調用父類的虛擬析構函數


3.對象識別服務: 提供對象判斷,識別的機制
  TObject = class
   ...
    class function ClassName: ShortString;
    class function ClassNameIs(const Name: string): Boolean;
    class function ClassParent: TClass;
    class function InstanceSize: Longint;
    class function InheritsFrom(AClass: TClass): Boolean;
    ...
  end;
 
  ClassName:返回類名稱
  ClassNamels:判斷特定類的名稱
  ClassParent:返回類的父類
  InstanceSize:返回類對象佔據的內存的大小
  InheritsFrom:判斷類是否從特定的類繼承下來的
 
  對象識別服務方法都是聲明稱類方法(Class Method),所謂類方法就是程序代碼中不需要這個類的對象實體來調用,可直接使用:
 
  類.類方法

4.對象信息服務: 提供程序代碼存取對象信息的服務
  TObject = class
  ...
    class function ClassInfo: Pointer;
    class function MethodAddress(const Name: ShortString): Pointer;
    class function MethodName(Address: Pointer): ShortString;
    function FieldAddress(const Name: ShortString): Pointer;
    function GetInterface(const IID: TGUID; out Obj): Boolean;
    class function GetInterfaceEntry(const IID: TGUID): PInterfaceEntry;
    class function GetInterfaceTable: PInterfaceTable;
    function SafeCallException(ExceptObject: TObject;
      ExceptAddr: Pointer): HResult; virtual;
     ...
  end;
 
  ClassInfo: 返回類的RTTI表格信息
 MethodAddress: 返回Published 類方法的地址
 MethodName: 返回類名方法的名稱
 FieldAddress: 返回Published 的字段變量
 GetInterface: 返回類實現的接口信息
 GetInterfaceEntry: 返回特定接口的信息
 GetInterfaceTable: 返回類所有實現接口的表格信息
 SafeCallException: 處理使用 Safe Call 異常的虛擬方法
 
5.對象消息分派服務: 提供Object Pascal分派消息的服務,和VCL封裝窗口消息有密切的關係

 

VCL FrameWork 方法種類
1.類方法(Class Method),也叫靜態方法(Static Method):類範圍內的方法,可直接使用類名稱來調用,無需經由類對象來調用
2.對象方法(Object Method):類一般定義的方法,經由類對象來調用
3.虛擬方法(Virtual Method): 提供派生類(derived Class)改寫(override)父類(Parent Class)定義的方法機制
4.重載方法(Overload Method): 定義同名,但具有不同參數原型的方法,主要是定義多個構造函數,活接受不同參數,但有相同名稱的函數
5.動態方法(Dymanic Method):類似於虛擬方法,但可以大幅減少VMT的大小,效率比虛擬方法稍微慢一點
6.事件處理函數(Event Handler):組件階層VCL對象的特別方法,可結合圖形用戶界面提供反應外界觸發事件的能力

注意:
 1.在父類中同時是虛擬方法和重載方法,派生類必須要加 reintroduce 來聲明

 

發佈了45 篇原創文章 · 獲贊 0 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章