判断类是否实现接口,获取类实现的接口
代码
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
确定给定的对象或接口是否支持指定接口。如果支持该接口,则将接口作为 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
如果对象支持请求的接口,则将接口作为 Obj 参数返回,并返回 S_OK
。如果不支持,则返回 E_NOINTERFACE
。
参数
IID 接口标识
Obj 如果支持该接口时,返回的接口。
如果成功返回接口指针,它会自动增加引用计数。
参考
GUID And Interface Support Routines
标签:function,const,实现,delphi,接口,IID,ICeShi,Supports From: https://www.cnblogs.com/txgh/p/18063157