判斷類是否實現介面,獲取類實現的介面
程式碼
type
ICeShi = interface
['{37CABB9D-CAA2-4589-A0C8-5AA1424E525B}']
function ToPrint: string;
end;
TCeShi = class(TInterfacedObject, ICeShi)
function ToPrint: string;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
vT: TCeShi;
vI: ICeShi;
begin
vT := TCeShi.Create;
if Supports(vT, ICeShi, vI) then
begin
Memo1.Lines.Add(vT.ToString + '支援ICeShi介面');
Memo1.Lines.Add('介面ICeShi的ToPrint方法 ' + vI.ToPrint);
end;
if vT.QueryInterface(ICeShi, vI) = S_OK then
begin
Memo1.Lines.Add(vT.ToString + '支援ICeShi介面');
Memo1.Lines.Add('介面ICeShi的ToPrint方法 ' + vI.ToPrint);
end;
end;
方法
System.SysUtils.Supports
function Supports(const Instance: IInterface; const IID: TGUID; out Intf): Boolean;
function Supports(const Instance: TObject; const IID: TGUID; out Intf): Boolean;
function Supports(const Instance: IInterface; const IID: TGUID): Boolean;
function Supports(const Instance: TObject; const IID: TGUID): Boolean;
function Supports(const AClass: TClass; const IID: TGUID): Boolean;
unit
System.SysUtils
確定給定的物件或介面是否支援指定介面。如果支援該介面,則將介面作為 Intf 引數返回,並返回 True。如果不支援,則返回 False。
引數
Instance 指定的物件或介面
AClass 指定的類
IID 介面標識
Intf 如果支援該介面時,返回的介面。
與直接呼叫
QueryInterface
不同,Supports
允許傳遞 nil 值作為例項。除了過載
Supports(TClass, TGUID)
檢查TClass
是否實現介面之外,其他過載版本的Supports
都會從一個物件或另一個介面引用中提取介面引用,從而導致基礎物件的引用計數增加,然後在退出時釋放介面(減少引用計數)。對於引用計數為零的物件,這將導致物件銷燬。var Obj: TInterfacedObject; begin Obj := TInterfacedObject.Create; if Supports(Obj, IInterface) then { ... 此時Obj將被釋放 } end;
System.TInterfacedObject.QueryInterface
function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
unit
System
如果物件支援請求的介面,則將介面作為 Obj 引數返回,並返回 S_OK
。如果不支援,則返回 E_NOINTERFACE
。
引數
IID 介面標識
Obj 如果支援該介面時,返回的介面。
如果成功返回介面指標,它會自動增加引用計數。
參考
GUID And Interface Support Routines