首页 > 其他分享 >判断某个类是否实现了某个接口

判断某个类是否实现了某个接口

时间:2023-05-13 17:13:44浏览次数:38  
标签:判断 end FItemObjectOffset ISomeInterface 接口 var TSomeObject 某个

通过TObject.GetInterface可以获得对象的实例实现某个接口,前提条件是必须实例化对象后才能运行GetInterface

下面的方法可获取类是否实现了某个接口,并返回接口的偏移:

function FindInterface(AClass: TClass; GUID:TGUID; var Offset:NativeInt):Boolean; var   i : integer;   InterfaceTable: PInterfaceTable;   InterfaceEntry: PInterfaceEntry; begin   while Assigned(AClass) do   begin     InterfaceTable := AClass.GetInterfaceTable;     if Assigned(InterfaceTable) then     begin       for i := 0 to InterfaceTable.EntryCount-1 do       begin         InterfaceEntry := @InterfaceTable.Entries[i];         if InterfaceEntry.IID=GUID then         begin           Offset:=InterfaceEntry.IOffset;           Exit(True);         end;       end;     end;     AClass := AClass.ClassParent;   end; end;

下面我们看下通过偏移量的快速获得对象的接口,以及通过接口快速获取对象:

快速获取对象的接口:

type

  TSomeObject=class(TXXX, ISomeInterface)   ......   end;   var   FItemObjectOffset:NativeInt;   //获取偏移量 FindInterface(TSomeObject, ISomeInterface, FItemObjectOffset)   var   P:TSomeObject;   Intf:ISomeInterface; ....................................   //通过对象直接获取接口     PNativeInt(@Intf)^:=PNativeInt(@P)^+ FItemObjectOffset;     Intf._AddRef; 快速通过接口获取对象 type   TSomeObject=class(TXXX, ISomeInterface)   ......   end;   var   FItemObjectOffset:NativeInt;   //获取偏移量 FindInterface(TSomeObject, ISomeInterface, FItemObjectOffset)   var   P:TSomeObject;   Intf:ISomeInterface; ....................................   //通过接口获取对象   P:=TSomeObject(Pointer(PNativeInt(@Intf)^- FItemObjectOffset));

 

标签:判断,end,FItemObjectOffset,ISomeInterface,接口,var,TSomeObject,某个
From: https://www.cnblogs.com/lucken2000/p/17397706.html

相关文章

  • 接口的细节和多态
    1. 接口部分接上2. 接口细节01  4051)接口不能被实例化2)接口中所有的方法是public方法,接口中抽象方法,可以不用abstract 修饰图示:3) 一个普通类实现接口,就必须将该接口的所有方法都实现。4)抽象类实现接口,可以不用实现接口的方法。代码在com.stulzl.interface_detalil.包中......
  • 爆肝一周,我开源了chat gpt 接口,官方1:1镜像支持全部 官方接口
    这里实现我之前文章承诺承接上文人人实现ChatGPT自由,手把手教你零撸部署自己聊天私服现在ChatGPT提供了api接口可以让我自己对接去实现我们自己想要gpt应用,但是由于一些原因,国内也不开放接口,所以我就1:1自己对接了官方所有接口。大家可以通过我的接口轻松实现一个自己定制化......
  • 正确使用php开发系列:判断数组的key是否存在
    背景:我们习惯上使用!empty($data['data']['list']判断数组$data里有没有key为list的元素,正确判断key是否存在的方式应该使用array_key_exists 为什么不要使用!empty($data['data']['list'],因为当list不存在时,会报错!......
  • 西门子S7-1500暖通空调冷水机组PLC程序案例, 硬件采用西门子1500CPU+ET200SP接口IO模块
    西门子S7-1500暖通空调冷水机组PLC程序案例,硬件采用西门子1500CPU+ET200SP接口IO模块,HMI采用西门子触摸屏。程序采用SCL控制程序编程,系统水泵采用一用一备,通过程序实现了加减机控制,根据压差控制开启的水泵台数以及频率;还有焓值计算FB块,输入干球温度,干球湿度可自动计算湿球温度,......
  • mac M2 apple silicon kettle 在线http 接口执行任务
    carte和kettleCarte作为Kettle服务器的一种实现,可以方便地管理和执行转换和作业,并且可以在分布式环境中扩展使用Carte,可以通过RESTWeb服务接口进行调度和监视转换和作业。配置cartedata-integration/pwd/carte-config-master-8080.xml<slave_config><slaveserver......
  • excel中判断某个单元格包含某个字符的方法
    在Excel中,你可以使用FIND或SEARCH函数来判断一个单元格是否包含某个字符。这两个函数都会返回子字符串在单元格内容中的起始位置,如果没有找到子字符串,则返回错误。FIND和SEARCH函数的基本语法是相似的,但FIND函数区分大小写,而SEARCH函数不区分大小写。以下是FIND和SEARCH函数的基......
  • JS 判断电脑是 Win 还是 mac?
    //判断系统类型functionOSnow(){constagent=navigator.userAgent.toLowerCase()constisMac=/macintosh|macosx/i.test(navigator.userAgent)if(agent.indexOf('win32')>=0||agent.indexOf('wow32')>=0){//yourcode......
  • 使用golang编写支持C++调用的动态库,接口支持结构体和回调函数
    网上有很多例子介绍如何使用cgo实现C/C++与golang进行接口交互。我有个项目是使用Qt写的客户端程序,但Qt在需要使用redis、支持表单的web服务、mq或网络化日志库等需求时,往往需要加载一大堆第三方库,且编译复杂,跨平台(如Windows/linuxarm/linuxx86)编译时较为复杂。鉴于有使用go......
  • 如何设计接口测试用例?(文末送接口测试用例模板)
    接口测试是项目测试的一部分,正如其名,它测试的主要对象是接口,是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与所测系统之间以及内部各系统之间的交互点。测试的重点是检查数据交互、传递、和控制管理过程以及系统间的相互依赖关系等。如何设计接口测试用例?首先,明......
  • 接口自动化
    一、接口测试和接口自动化测试行情目前主流的接口测试工具:(中小型公司、项目)Postman+Newman+Git+JenkinsJmeter+Ant+Git+Jenkins目前主流的接口自动化测试技术:(大型的公司、项目)python+requests+pytest+allure+jenkins二、requests库简介requests用来发送http请求以及......