五种方法之静态方法,虚拟方法,动态方法,消息方法,抽象方法

明生: 要理解面向对像就必须要掌握属性与方法和事件..这可是分开的..下面有一个神回答…..

“属性”:就像名字,大小,位置等等
“方法”:就是你对一个问题实现的过程
“事件”:就是一个控件所发生的事情

方法类型有:
1.静态方法 (Static) 默认类型,可以省略关键字
2.虚拟方法 (Virtual)
3.动态方法 (Dynamic)
4.消息方法 (Message)
5.抽象法方 (Abstract)

=======================================================
1)静态方法[static]
静态方法类似于通常的过程和函数,编译器在编译时就已指定了输出该方法的对象实例。静态方法的主要优点是调用速度快。

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)中占有一个索引号

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号

type
      TBox = class(TCustomcontrol)
      private
      procedure WMChar(Var Message : TWMChar); message WMCHAR;
      end;

 

//消息常量WMCHAR表示消息处理程序要响应的Windows消息。
消息处理程序不能使用Cdecl调用约定,也不能用virtual、dynamic、override、abstract等指示字。

procedure TBox.WMChar(var Message:TWMChar); message WMChar;
begin
      inherited; //继承父类的同名方法,消息方法通常都添加此句,在需要的时候也可以添加这句
      ... ...
end;

使用inherited保留字的一个好处是,如果Delphi没有提供处理该消息的默认处理程序,程序就会自动调用TObject的DefaultHandler方法,这是一个能对所有消息进行基本处理的默认处理程序。

=======================================================
5)抽象方法[abstract]
所谓抽象方法,首先必须是虚拟的或动态的,其次在它所在类中只能声明而不能定义,只能在派生类中定义它(重载)。因此定义一个抽象方法,只是定义它的接口,而不定义底层的操作。

type
      TDesign = class(TObject)
      procedure Draw; virtual; abstract;
      ... ...
      end;

 

//abstract必须写在virtualdynamic指示字后面。在派生类中重载抽象方法,跟重载普通的虚拟或动态方法相似,不同的是在重载的方法定义中不能使用inherited保留字,因为基类中抽象方法本来就没有定义。同样,抽象方法没有被重载,程序就不能调用这个抽象方法。重载的方法必须具有和虚拟方法完全相同的参数类型,另外,方法的具体实现部分不能加override等指示字。这些指示字只需要在类的定义中添加,而无需在类的实现中添加。

 

值得注意的是以上这些关于类的七篇文章转自网络和本人稍作整理所得t,如您是作者请联系本人为您的连接添上一份贡献…….

此项目被张贴在未分类 。书签的 permalink

发表评论

电子邮件地址不会被公开。 必填项已用*标注