delphi 判断类是否实现接口,获取类实现的接口

判断类是否实现接口,获取类实现的接口

代码

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

posted @ 2024-03-09 18:57  txgh  阅读(19)  评论(0编辑  收藏  举报