(3)delphi 的五种方法类型

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必须写在virtualdynamic指示字后面。在派生类中重载抽象方法,

跟重载普通的虚拟或动态方法相似,不同的是在重载的方法定义中不能使用

inherited保留字,因为基类中抽象方法本来就没有定义。同样,抽象方法没有

被重载,程序就不能调用这个抽象方法。
重载的方法必须具有和虚拟方法完全相同的参数类型,另外,方法的具体实

现部分不能加override等指示字。这些指示字只需要在类的定义中添加,而无

需在类的实现中添加。

原文地址:https://www.cnblogs.com/mdnx/p/2573763.html