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

    需在类的实现中添加。

  • 相关阅读:
    Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (二) —— SQLite
    理解 Continuation
    99种用Racket说I love you的方式
    Racket Cheat Sheet
    scheme 教程 #lang racket
    开始学习Scheme
    MIT Scheme 的基本使用
    CPS变换
    SECD machine
    scheme 之门
  • 原文地址:https://www.cnblogs.com/mdnx/p/2573763.html
Copyright © 2020-2023  润新知