|
DELPHI面向对象参考 陈奇 2005-07-21 一、类和对象 类是对象的类型,是创建对象的模板。一个类可以创建多个对象,而一个对象总是属于某个类。类具有内部的属性(状态)和行为(操作)。 对象是类的实例,具有区别于同类其他对象的属性集合。 对象的声明存放于堆栈,对象的引用存放于堆。 二、类的方法分类 1、 普通方法 不加任何修饰的方法为普通方法。普通方法必须调用类的实例进行访问。即必须 建类的对象,调用方式为:对象.方法,声明方式为: procedure[function] 方法名(参数表)[:返回值]; 2、 构造方法 构造方法用于创建类的实例,调用后返回类的句柄。构造方法可以有多个版本。声明方式是: constructor 构造方法名(参数表); 3、 析构方法 析构方法用于销毁类的实例,一般不建议直接调用析构方法,而采用调用对象.Free的方式进行对象释放。声明方式为: destructor 析构方法名(参数表); 4、 类方法 类方法属于一个类,在运行时即存在于内存中。可使用类.方法的方式进行调用,即不需要创建类的实例。声明方式是在普通方法前加class: class procedure[function] 方法名(参数表)[:返回值]; 5、 消息处理方法 消息处理方法和一个唯一的消息ID进行关联,用于响应动态分派的消息。声明方式: procedure 方法名(消息变元);message 消息ID; 三、多态、继承、重载 1、 静态方法 静态方法由对象的类决定。属于“早期联编”,即在编译阶段就决定了方法的实现版本。一个类的实例可创建为其他类的实例,但是调用到同名方法时,使用的方法是声明该实例的类的静态方法,声明方式: procedure[function] 方法名(参数表)[:返回值]; 2、 虚拟方法 虚拟方法可实现“后期联编”,即在程序运行时可动态调用不同的方法版本,实现多态。所有类的虚拟方法在内存中建立了一张VMT(虚拟方法表),在调用时动态定位方法函数的位置。比动态方法多占用内存空间,但是速度较快。声明方式: procedure[function] 方法名(参数表)[:返回值];virtual; 3、 动态方法 虚拟方法可实现“后期联编”,即在程序运行时可动态调用不同的方法版本,实现多态。本类的动态方法在内存中建立了一个DMT(动态方法表),在调用时根据动态方法唯一的编号定位方法地址。比虚拟方法少占用内存,但是速度较慢(因为可能用到祖先类的动态方法)。声明方式: procedure[function] 方法名(参数表)[:返回值];dynamic; 4、 抽象方法 抽象方法不提供方法的实现脚本。只提供一个方法的签名(方法名称、参数表、返回值)。一般在高级别类中使用抽象方法。派生类对抽象方法进行覆盖、重载实现抽象方法脚本。使用抽象方法,必须创建实现了抽象方法的类(一般为派生类)才可使用。因为抽象方法也属于“后期联编”,因此必须和虚拟方法、动态方法结合,声明方式: procedure[function] 方法名(参数表)[:返回值];virtual;abstract; procedure[function] 方法名(参数表)[:返回值];dynamic; abstract; 抽象方法提供了一种从高层次视图观察对象的方式 5、 方法覆盖 在父类中生命的静态方法、虚拟方法、动态方法,都可在派生类中进行同名签名登记。这将覆盖父类的这些方法。提供更特殊的功能,声明方式: procedure[function] 方法名(参数表)[:返回值];override; 方法的覆盖提供了对类的多态性 6、 方法重载 在父类中生命的静态方法、虚拟方法、动态方法,都可在派生类中进行同名签名登记,但是需要不同的参数表。这将重载父类的这些方法。提供更特殊的功能,声明方式: procedure[function] 方法名(参数表)[:返回值];overload; 方法的重载提供了对类的扩充性 四、reintroduce、self、is、as 1、 r [1] [2] [3] [4] [5] 下一页 |