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編譯會提示下面錯誤,至於緣由咱們在下一節進行學習理解。