,3delphi 的五种方法类型

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等指示字。这些指示字只需要在类的定义中添加,而无

需在类的实现中添加。