delphi 判斷類是否實現介面,獲取類實現的介面

txgh發表於2024-03-09

判斷類是否實現介面,獲取類實現的介面

程式碼

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

相關文章