Delphi中的接口和抽象类

转载 2012年03月29日 14:45:04

接口:Interface

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

1、抽象类

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

TCode = class

Protected

  function Decode(Src: String): String; virtual; abstract;

  function Encode(Src: String): String; virtual; abstract;

End;

这是段代码定义了一个有密码的抽象类,它规定了该类的两个行为,即编码和解码。但它只是规定了这两个行为而没有去实现它们,因为具体到不同的加密体系,它们编码和解码的行为是不一样的,所以这两个行为交由具体的派生类去实现。这是一段合法的代码,但是当我们试图去创建它的实例的时候Delphi就会抛出一个EAbstractError的异常,因为我们不能为一个抽象类去创建它的实例。

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

 

 2、接口和抽象类的不同

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

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

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

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)接口是不变的,也就是说,一旦声明并公开了某个接口后就不允许再对它进行修改,如果我们要增删它所规定的行为,就只能另外声明一个接口

 

 3、接口的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自己胡编出来的GHID,而是Delphi调用了Windows的API的函数CoCreateGuid创建的,它借助开放软件基金会(OSF)定义的算法,从统计学的角度说,能保证其全球唯一性。


php中抽象类和接口的区别

php中抽象类和接口的区别    1) 概念          面向对象的三大概念:封装,继承,多态        把属性和方法封装起来就是类。       一个类的属性和方法被另外的类复制就是...
  • Sunny_LG
  • Sunny_LG
  • 2016年06月22日 21:23
  • 1278

接口和抽象类的异同——加入Java8的特性。

Java中,抽象类和接口有相似的地方。下面我们就来细说说接口和抽象类的异同。首先是相同的地方:1. 接口和抽象类都能定义方法和属性。 2. 接口和抽象类都是看作是一种特殊的类。大部分的时候,定义的...
  • a907691592
  • a907691592
  • 2016年06月06日 20:11
  • 2824

Java 抽象类、普通类、接口的区别——值得你一看的干货

【概念】 抽象类、具体类是相对的,并非绝对的。抽象是一种概念性名词,具体是一种可见可触摸的现实对象。概念越小,则其抽象程度就越大,其外延也越大,反之亦然。简单说,比如“人”比“男人”抽象...
  • csdn_aiyang
  • csdn_aiyang
  • 2017年05月04日 16:26
  • 2266

抽象类与接口中方法的相同点和不同点

  • 2010年12月05日 14:19
  • 21KB
  • 下载

dot Net中抽象类与接口的区别

  • 2008年07月31日 19:39
  • 80KB
  • 下载

第7章 抽象类与接口.ppt

  • 2008年11月23日 09:40
  • 235KB
  • 下载

接口和抽象类

  • 2008年08月24日 22:08
  • 112KB
  • 下载

面向对象与Java实现(抽象类、接口

  • 2012年05月14日 13:12
  • 177KB
  • 下载

抽象类和接口的区别

  • 2011年09月15日 20:57
  • 19KB
  • 下载

接口和抽象类的各种使用方式

  • 2015年09月06日 15:36
  • 2.49MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Delphi中的接口和抽象类
举报原因:
原因补充:

(最多只允许输入30个字)