Delphi 中接口实现:Implementing Interfaces

news2025/1/18 10:40:02

 

        

目录

一、类声明(Class Declarations)

二、方法解决说明(Method Resolution Clause)

三、更改继承实现(Changing Inherited Implementations)

四、通过委托实现接口(Implementing Interfaces by Delegation)

五、委托接口类型属性(Delegating to an Interface-Type Property)

六、委托给类类型属性(Delegating to a Class-Type Property)


        接口一经声明,必须在类中实现后才能使用。在类的声明中,在类的祖先名称之后指定了类所实现的接口。

一、类声明(Class Declarations)

此类声明的形式如下 :

type className = class (ancestorClass, interface1, ..., interfaceN)
   memberList
end;

例如:

type
  TMemoryManager = class(TInterfacedObject, IMalloc, IErrorInfo)
    // ...

        声明了一个名为 TMemoryManager 的类,该类实现了 IMalloc 和 IErrorInfo 接口。当一个类实现一个接口时,它必须实现(或继承实现)接口中声明的每个方法。

以下是 System.TInterfacedObject 的声明(在 Windows 平台上,在其他平台上,声明略有不同):

type
 TInterfacedObject = class(TObject, IInterface)
 protected
   FRefCount: Integer;
   function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
   function _AddRef: Integer; stdcall;
   function _Release: Integer; stdcall;
 public
   procedure AfterConstruction; override;
   procedure BeforeDestruction; override;
   class function NewInstance: TObject; override;
   property RefCount: Integer read FRefCount;
 end;

TInterfacedObject 实现了 IInterface 接口。因此,TInterfacedObject 声明并实现了三个 IInterface 方法中的每一个。

实现接口的类也可用作基类。(上面的第一个示例将 TMemoryManager 声明为 TInterfacedObject 的直接继承)。每个接口都继承自 IInterface,实现接口的类必须实现 QueryInterface、_AddRef 和 _Release 方法。单元 System 中的 TInterfacedObject 实现了这些方法,因此是一个方便的基类,可以从中派生出其他实现接口的类。

实现接口时,接口的每个方法都会被映射到实现类中的一个方法上,该方法具有相同的结果类型、相同的调用约定、相同的参数数以及每个位置上相同类型的参数。默认情况下,每个接口方法都会映射到实现类中的同名方法。
 

二、方法解决说明(Method Resolution Clause)

通过在类声明中包含方法解析子句,可以覆盖默认的基于名称的映射。当一个类实现了两个或多个具有相同命名方法的接口时,可以使用方法解析子句来解决命名冲突。

方法解析子句的形式如下 :

procedure interface.interfaceMethod = implementingMethod;

或者

function interface.interfaceMethod = implementingMethod;

其中,implementingMethod 是该类或其祖先类中声明的方法。implementingMethod 可以是类声明中稍后声明的方法,但不能是其他模块中声明的祖先类的私有方法。

例如 :

type
  TMemoryManager = class(TInterfacedObject, IMalloc, IErrorInfo)
    function IMalloc.Alloc = Allocate;
    procedure IMalloc.Free = Deallocate;
   // ...
  end;

将 IMalloc 的 Alloc 和 Free 方法映射到 TMemoryManager 的 Allocate 和 Deallocate 方法上。

方法解析子句不能改变父类引入的映射。

三、更改继承实现(Changing Inherited Implementations)

子类可以通过覆盖实现方法来改变特定接口方法的实现方式。这要求实现方法是虚拟的或动态的。

类还可以重新实现从祖先类继承的整个接口。这需要在子类的声明中重新列出接口。例如:

 

type
  IWindow = interface
    ['{00000115-0000-0000-C000-000000000146}']
    procedure Draw;
    // ...
  end;
  TWindow = class(TInterfacedObject, IWindow)
    // TWindow implements IWindow pocedure Draw;
    // ...
  end;
  TFrameWindow = class(TWindow, IWindow)
    // TFrameWindow reimplements IWindow procedure Draw;
    // ...
  end;

        重新实现接口会隐藏同一接口的继承实现。因此,父类中的方法解析条款对重新实现的接口没有任何影响。

四、通过委托实现接口(Implementing Interfaces by Delegation)

implements 指令允许将接口的实现委托给实现类中的一个属性。例如 :

property MyInterface: IMyInterface read FMyInterface implements IMyInterface;

声明了一个名为 MyInterface 的属性,该属性实现了接口 IMyInterface。

implements 指令必须是属性声明中的最后一个指定符,并且可以列出多个接口,中间用逗号隔开。委托属性 :

  • 必须是类或接口类型。
  • 不能是数组属性,也不能有索引说明符。
  • 必须有读取说明符。如果属性使用读取方法,则该方法必须使用默认寄存器调用约定,不能是动态的(尽管可以是虚拟的),也不能指定消息指令。

用于实现委托接口的类应该派生自 System.TAggregatedObject。

五、委托接口类型属性(Delegating to an Interface-Type Property)

如果委托属性属于接口类型,则该接口或其派生接口必须出现在声明该属性的类的祖先列表中。委托属性必须返回一个对象,该对象的类完全实现了 implements 指令指定的接口,并且不含方法解析子句。例如 :

type
  IMyInterface = interface
    procedure P1;
    procedure P2;
  end;
  TMyClass = class(TObject, IMyInterface)
    FMyInterface: IMyInterface;
    property MyInterface: IMyInterface read FMyInterface implements IMyInterface;
  end;
var
  MyClass: TMyClass;
  MyInterface: IMyInterface;
begin
  MyClass := TMyClass.Create;
  MyClass.FMyInterface := ...// some object whose class implements IMyInterface
  MyInterface := MyClass;
  MyInterface.P1;
end;

六、委托给类类型属性(Delegating to a Class-Type Property)

如果委托属性属于一个类的类型,则在搜索外层类及其祖先之前,先搜索该类及其祖先中实现指定接口的方法。因此,可以在属性指定的类中实现某些方法,而在声明属性的类中实现其他方法。方法解析子句可以按通常的方式用于解决歧义或指定特定方法。一个接口不能由多个类类型属性实现。例如 :

type
  IMyInterface = interface
    procedure P1;
    procedure P2;
  end;
  TMyImplClass = class
    procedure P1;
    procedure P2;
  end;
  TMyClass = class(TInterfacedObject, IMyInterface)
    FMyImplClass: TMyImplClass;
    property MyImplClass: TMyImplClass read FMyImplClass implements IMyInterface;
    procedure IMyInterface.P1 = MyP1;
    procedure MyP1;
  end;
procedure TMyImplClass.P1;
     // ...
procedure TMyImplClass.P2;
     // ...
procedure TMyClass.MyP1;
     // ...
var
  MyClass: TMyClass;
  MyInterface: IMyInterface;
begin
  MyClass := TMyClass.Create;
  MyClass.FMyImplClass := TMyImplClass.Create;
  MyInterface := MyClass;
  MyInterface.P1;  // calls TMyClass.MyP1;
  MyInterface.P2;  // calls TImplClass.P2;
end;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/926180.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

决策树算法:随机森林民主算法【02/2】

决策树民主:随机森林算法 一、介绍: 记住您在阅读亚马逊上的所有评论后进行的最后一次购买,或者在查看 IMDb 评级后您观看的以前的电影。人类是社会动物,他人的意见和行为自然会影响我们。我们的决定在很大程度上取决于“群体智慧…

书单背景图片哪里找?如何制作成视频?

有没有小伙伴们发现,如今很多热门的短视频平台有很多使用书单文案制作的视频,很多情感博主会配上一些精致的图片,唯美的背景承载着一些美好的文案内容。这种类型的视频让不少的小伙伴都想制作专属于自己的视频来投稿,那么小伙伴们…

泡泡玛特上半年收入超28亿元 净利润超去年全年

8月22日,泡泡玛特发布2023中期业绩。数据显示,上半年实现营收28.14亿元,经调整净利润5.35亿元,同比增长42.3%,其中净利润4.77亿元,超去年全年净利润。海外业务延续高速增长态势并首次披露利润情况&#xff…

FOC控制框架图

pmsm电机数学模型以及FOC控制框图(开源小项目FOC控制BLDC电机)_foc 框图_栋哥爱做饭的博客-CSDN博客 电机控制----FOC框架讲解_foc电机控制_修才生的博客-CSDN博客

pdf编辑文字怎么编辑?这几种简单编辑方法看一看

pdf编辑文字怎么编辑?PDF文件是一种普遍的文档格式,但是在编辑时却比较困难。幸运的是,有许多PDF编辑器可以帮助我们轻松地编辑PDF文件。本文将介绍一些简单的PDF编辑方法,跟着我一起来看看吧! 第一种方法:…

2.4G芯片G350规格书介绍,小体积易开发

给大家介绍一款2.4g芯片,G350是宇凡微电子开发的一款低成本、高集成度的无线收发芯片,内置了发射机、接收机、频率综合器和GFSK调制解调器,以满足各种无线通信需求。无论是在电子标签、无线遥控、无线键盘鼠标、智能家居、工业通信还是商用近…

vue页面中想在input框用户输入的参数后加单位的方法

<el-form-item label"金重" prop"weight"><el-input v-model"form.weight" placeholder"请输入金重"><template #append><div>g</div></template></el-input></el-form-item>

项目开展CICD的实践探路 | 京东物流技术团队

本文介绍了作者对CICD的理解以及在项目中开展CICD的几种场景&#xff0c;总结了每种场景实践的关键节点、带来的收益&#xff0c;以及结合具体项目开展的实际应用。读者可以借鉴本文中描述的场景&#xff0c;或借鉴文中提到的实践方式&#xff0c;在项目中开展CICD&#xff0c;…

【PHP】PHP开发教程-PHP开发环境安装

1、PHP简单介绍 PHP&#xff08;全称&#xff1a;Hypertext Preprocessor&#xff09;是一种广泛使用的开放源代码脚本语言&#xff0c;特别适用于Web开发。它嵌入在HTML中&#xff0c;通过在HTML文档中添加PHP标记和脚本&#xff0c;可以生成动态的、个性化的Web页面。 PHP最…

Java小项目|拼图小游戏|黑马

项目技术需求 Java基础 基本if、forio流File集合JFrame【看得懂就行】 项目素材以及打包exe&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1rPazJezTwS9O6e8BoYNIYA?pwd6666 项目运行截图 项目来源 哔哩哔哩-黑马程序员上 哔哩哔哩-黑马程序员下 项目介绍&…

mac电脑免费垃圾清理软件有哪些?CleanMyMac好用不好用?

CleanMyMac是一款功能强大的mac垃圾清理软件&#xff0c;它可以帮助我们快速扫描和删除mac上的垃圾文件&#xff0c;释放磁盘空间&#xff0c;提升系统速度。本文将为你介绍CleanMyMac这款mac垃圾清理软件&#xff0c;以及CleanMyMac怎么关闭开机启动。 mac垃圾清理软件有很多…

SAP 资产屏幕增强(AS01/AS02/AS03)

导语&#xff1a;最新需要在资产屏幕上增加增强字段&#xff08;效果图在最后&#xff09;&#xff0c;下面分享一下实现过程。 一、在表中增强字段 本次增强的是【资产主数据->源】中的字段&#xff0c;选择储存在ANLU表中。 二、创建屏幕 在函数组XAIS中创建屏幕9001 在…

unity 模型显示在UI上 并交互(点击、旋转、缩放)

1.在Assets创建 Render Texture&#xff08;下面会用到&#xff09;&#xff0c;根据需要设置Size 2.创建UIRawImage&#xff0c;并把Render Texture赋上 3.创建相机&#xff0c;如下图&#xff1a; 4.基本UI的准备工作完成&#xff0c;剩下的就是代码了&#xff0c;值得一提&a…

qt 实现音视频的分贝检测系统

项目场景&#xff1a; 目前的产品经常播放m3u8流&#xff0c;有的视频声音正常&#xff0c;有的视频声音就偏低&#xff0c;即使放到最大音量声音也是比较小&#xff0c;所以就产生了某种需求&#xff0c;能否自动感知视频声音的大小&#xff0c;如果发现声音比较小的情况&…

vue3项目初始

yarn add types/node -D是这个 下面 少到了S 这一步 就是 配置配置 src

高通 A12 设置-存储 存储总大小显示不正确问题

总存储大小计算原理&#xff1a; 系统获取存储大小是通过获取”/system”和”/data” 两个Directory 的和来计算的&#xff0c;即Environment.getDataDirectory().getTotalSpace() Environment.getRootDirectory().getTotalSpace() 问题一 &#xff1a;实际存储大小大于等于1…

网安周报|国防承包商Belcan泄露了带有漏洞列表的管理员密码

1.国防承包商Belcan泄露了带有漏洞列表的管理员密码 网络新闻研究团队发现了一个开放的 Kibana 实例&#xff0c;其中包含有关 Belcan、其员工和内部基础设施的敏感信息。Belcan 是一家政府、国防和航空航天承包商&#xff0c;提供全球设计、软件、制造、供应链、信息技术和数字…

企业在选择低代码平台时,应该注意哪些方面?

在 IT行业&#xff0c;“低代码”这个词可以说是近几年的热词了。低代码开发平台&#xff08;Low-Code Platform&#xff09;是一种新型的软件开发工具&#xff0c;它可以通过少量代码快速开发应用程序。通过采用低代码技术&#xff0c;开发者可以减少自己编写和测试应用程序的…

国际数字影像文创产业园开展企业法律的讲座

2023年8月18日14:30-16:10由成都市金牛区人民政府五块石街道办事处指导&#xff0c;国际数字影像文创产业园区、成都树观法律咨询服务有限公司主办&#xff0c;成都目莓商业运营管理有限公司协办的“法律讲座沙龙”活动在数媒大厦5楼共享会议室成功开展。 本次活动主题为“企业…

网络工程----小型网络配置1

此次作业设计&#xff1a; 硬件&#xff1a;二层交换机、三层交换机、路由、服务器、pc 配置知识&#xff1a;dhcp, dns配置&#xff0c;vlan划分&#xff0c;不同vlan间通信&#xff0c;静态路由&#xff0c;Nat动态地址&#xff0c; nat server映射&#xff0c;acl 配置命…