• Delphi中的接口和抽象类


    参考:http://blog.csdn.net/xinzheng_wang/article/details/6058643

    接口:Interface

      Delphi中接口中的关键字Interface,但是它和Pascal单元中的Interface没有任何联系

    一、抽象类

      Delphi中的抽象类只定义行为的类,它规定了由此派生的类必须具备的某些行为。但是抽象类不实现这些行为,而必须由其派生类去实现这些行为。所以它只是一种“抽象”的类,而且,我们无法为抽象类创建实例。比如这段代码

    TCode = class
    protected
        function DeCode(Src: String): String; virtual; abstract;
        function EnCode(Src: String): String; virtual; abstract;
    end;
    

      这段代码定义了一个有密码的抽象类,它规定了该类的两个行为,即编码和解码。但它只是规定了这两个行为而没有去实现它们,因为具体到不同的加密体系,它们的编码和解码的行为不一样,所以这两个行为交由具体的派生类去实现。

      抽象类只定义了行为而没有去实现它们,所以它是“抽象”的。

    二、接口和抽象类的不同

      接口也定义了一系列的行为而没有去实现这些行为,这一点上和抽象类是一样的,准确的说,接口只是规定了接口的提供者和接口的使用者之间的协议

      既然有了抽象类为什么还要有接口?那一定是接口和抽象类有不同的地方,正式这种不同使它们应用在不同的场合或者满足不同的需求。弄清这些不同之处的过程,也就是我们理解借口这个概念的过程

      我们以同样的内容来声明一个接口

    ICode = interface
        function DeCode(Src: String): String;
        function EnCode(Src: String): String;
    end;
    

      从上面的形式看,接口和抽象了有点区别

    1)接口都以“I”打头(类以“T”打头)

    2)接口的关键字是interface(类的关键字是class)

    3)因为接口中的所有的函数和过程都是虚的,所以没有必要加上virtual的关键字

      但是以上的区别只是形式上的,还有一些实质上的区别

    1)对接口创建实例的代码在Delphi中是非法的,在编译期间会出现异常

    2)接口中所有的方法都是共有的,因此不能对接口中的域进行定义

    3)在接口中不能申明变量,这是它和类的一个很大的区别,因为接口只定义了行为而对实现这些行为不做规定,但是如果允许在接口中定义变量,则就在某种程度上干预域或者限制实现行为的方法

    4)接口是不变的,也就是说,一旦声明并公开了某个接口之后,就不允许再对它进行修改,我们淘增加或删除它所规定的行为,就只能另外声明一个接口。

    5)和4)有关,所以一个类可以实现一个接口,但是只能继承一个类

    6)抽象了可以有成员变量,可以自己实现其中的一些成员函数,也可以将方法定义为 virtual;abstract; 然后由其派生类实现

      但是接口不能有成员变量,而且也不能自己实现接口中的任何一个方法,只能由实现它的类来具体实现这些方法

    三、接口的GUID

      GUID是“全球唯一标识符”的缩写,它借助复杂的算法而保证在全球范围内的唯一性。每个接口都有一个GUID,系统据此注册和调用接口。事实上,上面那段声明接口的代码是不完整的,完整的声明代码看上去应该是这样的:

    ICode = interface
      ['{56E57F5F-5DD8-42FC-8D27-C35968C4474E}']
      function Decode(Src: String): String;
      function Encode(Src: String): String; 
    end;
    

      好在我们不必去关心GUID是怎样产生的,当我们需要给一个接口创建一个GUID时,我们只要在Delphi的IDE中同时按下Ctrl、Shift和G三个键,光标所在的位置就会出现一个GUID。

      其实这不是Delphi自己胡编出来的GUID,而是Delphi调用Windows的API函数:CoCreateGuid创建的,它借助开放软件基金会(OSF)定义的算法,从统计学的角度上说,能保证GUID的全球唯一性

  • 相关阅读:
    Windows下MemCache多端口安装配置
    PL/SQL Developer 9.x 注册码
    SQL Server 表变量和临时表的区别
    SQL 存储过程入门(事务)
    把存储过程结果集SELECT INTO到临时表
    在T-SQL语句中访问远程数据库(openrowset/opendatasource/openquery)
    解决SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' 的 STATEMENT'OpenRowset/OpenDatasource' 的访问的方法
    C#性能优化实践
    sql server 存储过程中使用变量表,临时表的分析(续)
    Request.Url.Port 获取不到正确的端口号
  • 原文地址:https://www.cnblogs.com/xumenger/p/4436964.html
Copyright © 2020-2023  润新知