接口和類一樣,只能在程序或單元的最外層被聲明(也就是interface section,也就是全局可見的),不能在過程或函數中聲明。接口類型的聲明格式如下:
type interfaceName = interface (ancestorInterface) //關鍵字interface
['{GUID}'] //全局唯一標識符
memberList //成員列表
end;
其中(ancestorInterface) 和['{GUID}'] 是可選的,接口聲明和類相似,但是有如下的約束:
1,memberList只能包含方法和屬性。字段在接口中是不允許的。
2,因為接口沒有字段,屬性的read和write指定的必須是方法。
3,所有接口的成員都是公開的(public)。可見性指定(private,protected等)和存儲指定(如stored, default, nodefault)都不允許。(但是一個數組屬性可以帶關鍵字default,請看末尾的說明)
4,接口沒有構造器和析構器。它不能被實例化,除了通過類來實現它的方法。
5,方法不能被聲明成virtual,dynamic,abstract或者override。因為接口不實現它自己的方法,這些指定是沒有意義的。
請看一個接口聲明的例子:
type
IMalloc = interface(IInterface)
['{00000002-0000-0000-C000-000000000046}']
function Alloc(Size: Integer): Pointer; stdcall;
function Realloc(P: Pointer; Size: Integer): Pointer; stdcall;
procedure Free(P: Pointer); stdcall;
function GetSize(P: Pointer): Integer; stdcall;
function DidAlloc(P: Pointer): Integer; stdcall;
procedure HeapMinimize; stdcall;
end;
在一些接口聲明中,關鍵字interface被dispinterface代替。答案是這(還有dispid,read only,write only指定)和特殊平台有關,在Linux編程中不使用。
還有幫助以外的個人一些見解:接口也用來解決多重繼承帶來的混亂問題。Delphi中一個派生類只能繼承一個類,但同時能繼承多個接口。
PS: 關於數組屬性的釋疑,同樣來自Delphi Help, 關鍵字Array properties
請先看例子:
property Strings[Index: Integer]: string ...; default;
這樣也我們就可以用object[index]來代替object.property[index];但是也要注意,象這樣的屬性只能存在一個,不然大家也知道會發生什麼事情了。