1、抽象类与接口的异同ide
接口简单的理解可认为是一个抽象类,咱们先定义一个抽象类和接口来对比之间的异同,代码以下:函数
type IFormattedNumber = interface //定义接口 function FormattedString: string; end; TFormattedNumber = class //定义抽象类 public function FormattedString: string; virtual; abstract; end;
上面定义了一个接口IFormattedNumber和抽象类TFormattedNumber,从delphi方法上来讲,都不能直接实例化,接口是经过类来实现的,而抽象类则是经过其派生类来实现其具体的功能。抽象类与接口的不一样我理解有如下几点:学习
(一)、接口经过Interface关键字定义,而类则经过Class关键字定义,接口以“I”前缀命名,抽象类则“T”前缀命名;spa
(二)、接口直接或者间接派生自IUnKnown,而类则派生自TObject;code
(三)、接口不能直接范围,只能是public,但不要声明;orm
(四)、接口不能声明变量,只能包含函数或者过程;blog
(五)、接口声明的函数和过程从概念上讲是virtual类型,但不能直接使用virtual关键。 接口
接口定义好后就不要修改,若是须要修改,通常的作法是定义新接口,这种作法的目的是保证调用者由于修改接口,而修改调用程序。若是须要增长功能,能够直接从父接口直接派生,如为IFormattedNumber增长SetValue(AValue:Integer)过程咱们能够如下代码实现声明:string
type IFormattedNumber2 = Interface(IFormattedNumber) procedure SetValue(AValue); end;
2、接口的声明和实现 it
接口声明和实现很简单,请看下面代码:
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编译会提示下面错误,至于缘由咱们在下一节进行学习理解。