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 來聲明