一、抽象类与接口的异同
接口简单的理解可认为是一个抽象类,我们先定义一个抽象类和接口来对比之间的异同,代码如下:
type IFormattedNumber = interface //定义接口 function FormattedString: string; end; TFormattedNumber = class //定义抽象类 public function FormattedString: string; virtual; abstract; end;
上面定义了一个接口IFormattedNumber和抽象类TFormattedNumber,从delphi方法上来说,都不能直接实例化,接口是通过类来实现的,而抽象类则是通过其派生类来实现其具体的功能。抽象类与接口的不同我理解有以下几点:
(一)、接口通过Interface关键字定义,而类则通过Class关键字定义,接口以“I”前缀命名,抽象类则“T”前缀命名;
(二)、接口直接或者间接派生自IUnKnown,而类则派生自TObject;
(三)、接口不能直接范围,只能是public,但不要声明;
(四)、接口不能声明变量,只能包含函数或者过程;
(五)、接口声明的函数和过程从概念上讲是virtual类型,但不能直接使用virtual关键。
接口定义好后就不要修改,如果需要修改,一般的做法是定义新接口,这种做法的目的是保证调用者因为修改接口,而修改调用程序。如果需要增加功能,可以直接从父接口直接派生,如为IFormattedNumber增加SetValue(AValue:Integer)过程我们可以以下代码实现声明:
type IFormattedNumber2 = Interface(IFormattedNumber) procedure SetValue(AValue); end;
二、接口的声明和实现
接口声明和实现很简单,请看下面代码:
unit Unit2; interface uses SysUtils; type IFormattedNumber = interface //接口声明 [‘{F9E8F5DE-781B-4B5B-B78A-0F88CF50E53F}‘] {GUID,Alt+Shift+G快捷键生成} function FormattedInteger: string; end; TFormattedNumber=class(TObject,IFormattedNumber) //实现接口类 private FValue:Integer; public constructor Create(AValue:Integer); destructor destroy;override; function FormattedInteger: string; //实现接口函数FormattedInteger; end; implementation constructor TFormattedNumber.Create(AValue:Integer); begin inherited Create; FValue:=AValue; end; destructor TFormattedNumber.destroy; begin inherited destroy; end; function TFormattedNumber.FormattedInteger:string; begin Result:=IntToStr(FValue); end; end.
接口只是声明功能的地方,具体由类来实现的,到这里我们理解"接口简单的理解可认为是一个抽象类"这句话了吧!以上代码delphi编译会提示下面错误,至于原因我们在下一节进行学习理解。