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 来声明