Delphi的方法类型有: 1.静态方法 (Static) 默认类型,可以省略关键字 2.虚拟方法 (Virtual) 3.动态方法 (Dynamic) 4.消息方法 (Message) 5.抽象法方 (Abstract)
======================================================= 1)静态方法[static] 静态方法类似于通常的过程和函数,编译器在编译时就已指定了输出该方法
的对象实例。静态方法的主要优点是调用速度快。 eg: type TAnimal = class(TObject) procedure Sound; procedure Sleep; ... ... end; ... ... TDog = class(TAnimal) procedure Sound; function Sleep:Integer; ... ... end; 静态方法不能被重载,上例中,派生类的静态方法只是替换了基类的静态方
法。即使Sleep方法在TAnimal中表现为过程而在TDog类中表现为函数。 =======================================================
2)动态方法[dynamic] 被声明为动态方法的方法不是放在类的虚拟方法表中,而是由编译器指定一
个索引号(一般不直接用到这个索引),当调用动态方法时,由索引号决定
调用方法的哪一个具体实现(即从重载的方法中选择哪一个来执行)。
虚拟方法在调用速度上较快,但其代码较长,类型对象占用的空间大;而动
态方法在调用速度上稍慢,但对象占用空间小。如果一个方法经常需要调用
,或该方法的执行时间要求短(速度快),则选择使用虚拟方法为好。 ======================================================= 3)虚拟方法[virtual] 虚拟方法比静态方法更灵活、更复杂。虚拟方法的地址不是在编译时确定的
,而是在程序运行期间根据调用这个虚拟方法的对象实例来确定的,这种方
法又称为滞后联编。虚拟方法在对象虚拟方法表(VMT)中占有一个索引号 eg: type TAnimal = class(TObject) procedure Eat; procedure Sound; virtual; procedure Sleep; dynamic; ... ... end;
TDog = class(TAnimal) procedure Sound; override; //重载 function Sleep:Integer; override; ... ... end; 只有virtual和dynamic可以被override,static不能被override(重载)。 ======================================================= 4)消息方法 Object Pascal规定消息处理程序方法必须是一个过程(procedure),并且带有一
个唯一的变量参数。message保留字后必须跟随一个范围在1~49151的整型常
量,以指定消息的ID号。eg: type TBox = class(TCustomcontrol) private procedure WMChar(Var Message : TWMChar); message WMCHAR; end; //消息常量WMCHAR表示消息处理程序要响应的Windows消息。 消息处理程序不能使用Cdecl调用约定,也不能用virtual、dynamic、override、
abstract等指示字。 eg: procedure TBox.WMChar(var Message:TWMChar); message WMChar; begin inherited; //继承父类的同名方法,消息方法通常都添加此句,在需要的时候也可以添加这句 ... ... end; 使用inherited保留字的一个好处是,如果Delphi没有提供处理该消息的默认处
理程序,程序就会自动调用TObject的DefaultHandler方法,这是一个能对所有
消息进行基本处理的默认处理程序。 ======================================================= 5)抽象方法[abstract] 所谓抽象方法,首先必须是虚拟的或动态的,其次在它所在类中只能声明而
不能定义,只能在派生类中定义它(重载)。因此定义一个抽象方法,只是
定义它的接口,而不定义底层的操作。 eg: type TDesign = class(TObject) procedure Draw; virtual; abstract; ... ... end; //abstract必须写在virtual或dynamic指示字后面。在派生类中重载抽象方法,
跟重载普通的虚拟或动态方法相似,不同的是在重载的方法定义中不能使用
inherited保留字,因为基类中抽象方法本来就没有定义。同样,抽象方法没有
被重载,程序就不能调用这个抽象方法。 重载的方法必须具有和虚拟方法完全相同的参数类型,另外,方法的具体实
现部分不能加override等指示字。这些指示字只需要在类的定义中添加,而无
需在类的实现中添加。
|
请发表评论