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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值