我想学习一个插件框架,但是那个框架里面大量用到了接口,于是不得不把接口看一下了。总感觉接口编程这一块非常的绕,每一行都注释了。
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type // 父接口 IGreetable = interface [‘{FE5A34E5-21AB-4120-971B-FDC3241AD55D}‘] // 用于返回一段文本 function SayHello: string; end; TMan = class(TObject, IGreetable) function SayHello: string; // 接口都会有的3个函数(QueryInterface,_AddRef,_Release) function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall; function _AddRef: Integer; stdcall; function _Release: Integer; stdcall; end; TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private // 弹出一段文本 procedure Greeting(Intf: IGreetable); {Private declarations} public {Public declarations} end; var Form1: TForm1; implementation {$R *.DFM} // 这里实现自己定义的_AddRef、_Release和QueryInterface方法 // 用于查找接口 function TMan.QueryInterface(const IID: TGUID; out Obj): HResult; begin // 找到返回0,找不到返回‘No such interface supported‘ if GetInterface(IID, Obj) then Result := 0 else Result := Windows.E_NoInterface; end; // 接口调用计数 function TMan._AddRef: Integer; begin Result := -1 end; // 接口释放计数 function TMan._Release: Integer; begin Result := -1 end; // 客户函数,返回一段文本 function TMan.SayHello: string; begin Result := ‘Hello‘; end; procedure TForm1.Greeting(Intf: IGreetable); begin // 输出一段话 ShowMessage(Intf.SayHello); end; procedure TForm1.Button1Click(Sender: TObject); var // 定义一个父接口 Intf: IGreetable; begin // 子接口创建 Intf := TMan.Create; // 调用的是子接口中的Greeting函数 Greeting(Intf); end; end.