news 2026/4/3 2:58:30

创建接口 【技术文章】

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
创建接口 【技术文章】

摘要

本文介绍接口的概念。阐述了接口在对象建模器中的作用、组成结构及使用方法。

CAA接口是什么?

面向对象设计及相关面向对象语言(如C++)允许应用程序员通过类来描述和编码真实对象,这些类包含结构部分(数据成员)和行为部分(成员函数或方法)。在C++中,类通过构造函数实例化,使用这些类的应用程序员可以引用声明为公共的数据成员和方法,在派生类构建新类时也可以使用声明为受保护的数据成员和方法。这是非常优秀的面向对象特性,但当类的头文件发生变更时(即使是私有部分的修改),所有包含该文件的应用程序都必须重新编译

更通用的对象设计方法是通过行为来审视对象,并仅使用方法描述行为:这提供了把握对象的接口。对于应用程序员而言,接口是对象的唯一可见部分,隐藏了其实现细节,这些细节完全由类提供者负责。

接口构成了框架类开发者和应用程序员之间的契约。该契约包括:要处理的现实世界对象、用于操作这些对象的方法以及调用这些方法的方式。这些内容不应随时间改变。仅允许进行添加操作,基于框架开发的应用程序绝不应因框架修改而需要重新编译。

实现接口是框架类开发者履行契约的方式。选择最合适的技术是其自主权,必要时可以从一种技术切换到另一种技术,而不会对应用程序产生影响。

已提供的接口不应随时间改变。已提供的接口实现也应持续支持未变更的接口,无需为客户端应用程序进行修改。如需修改(如新的方法签名),必须提供新接口。如需实现其他接口,现有实现不应改变,CAA提供了在不影响客户端应用程序的情况下扩展实现的方法。

适用接口与实现分离的需求包括:

  • 封装性:对象仅暴露操作句柄,而不暴露执行操作的内部机制
  • 多态性:共享相同接口的对象可以被应用程序以相同方式处理,即使这些对象以不同方式实现该接口
  • 继承性:具有公共接口的对象可视为暴露这些公共接口的基对象的种类。这些对象派生自基对象并继承其接口
  • 构建独立性:应用程序与其使用框架之间的耦合应尽可能弱。应用程序仅了解框架的接口,实现修改不需要重新编译应用程序
  • 框架开放架构:客户应能够实现框架接口并向现有实现添加新接口
  • 多重实现:具有给定接口的框架应能将多个实现与该接口关联。多重实现可以是静态的(顺序性)或动态的(同时性)。静态多重实现意味着当前实现在特定时间切换为另一个实现(例如适配新技术)。动态多重实现允许多个实现同时共存,并允许根据用户请求在实现间切换
  • 分布式对象架构:框架的对象实例应能够由运行在不同进程(可能在另一节点)的对象服务器处理,而非运行客户端应用程序的进程,可能通过将对象请求发送给远程对象服务器的对象请求代理实现

接口由什么构成?

示例接口

CATIA接口创建为C++抽象类,因此仅包含纯虚方法。它由头文件、源文件和TIE文件组成。

接口头文件

以下是CAAIXX CATIA接口头文件示例:

#ifndefCAAIXX_h#defineCAAIXX_h#include"CATBaseUnknown.h"externExportedByCAADLL IID IID_CAAIXX;classExportedByCAADLLCAAIXX:publicCATBaseUnknown{CATDeclareInterface;public:virtualHRESULT __stdcallMXX1()=0;virtualHRESULT __stdcallMXX2(CATBaseUnknown*pUnk)=0;};#endif

各语句作用如下:

接口头文件结构说明

  1. #ifndef#define#endif预处理器指令防止头文件被重复包含
  2. 包含CATBaseUnknown头文件,因为CAAIXX接口是从CATBaseUnknown派生的C++抽象类
  3. 任何接口都可通过声明为全局extern变量的标识符识别。该标识符必须唯一,并将在接口源文件中初始化
  4. 接口类必须从CATBaseUnknown或其他接口类派生。根据CATIA规则,不支持多重继承
  5. CATDeclareInterface声明该类为CATIA接口
  6. 方法具有以下特征:
    • 所有方法必须是公共的,因为任何接口方法都旨在被实现
    • 必须是纯虚函数,即接口类不提供这些方法的任何实现
    • 必须返回HRESULT1。这是用于使接口符合OLE标准的微软返回码
    • 必须使用__stdcall调用约定2。这是微软对C++编译器的扩展,也用于使接口符合OLE标准
    • 可以包含参数,通常是指向其他接口的指针

接口源文件

CAAIXX接口源文件如下:

#include"CAAIXX.h"IID IID_CAAIXX={0x7c1b4ba8,0x5c25,0x0000,{0x02,0x80,0x02,0x0b,0xcb,0x00,0x00,0x00}};CATImplementInterface(CAAIXX,CATBaseUnknown);

各语句作用如下:

接口源文件结构说明

  1. 包含CAAIXX头文件以获取IID声明,以及通过该头文件间接包含CATBaseUnknown头文件
  2. 接口IID初始化为全球唯一且持久的数值。也称为GUID(全局唯一标识符)3
  3. CATImplementInterface声明CAAIXX从CATBaseUnknown进行对象模型派生。接口必须始终从CATBaseUnknown进行对象模型派生

当然纯虚函数在声明它们的类中没有实现。

在CAAIXX的方法中,从接口IUnknown继承的三个方法(CATBaseUnknown派生自IUnknown)对接口起着特殊作用:

  • QueryInterface:从指向同一对象实现的另一个接口的指针返回指向某个接口的指针;
  • AddRef:为此接口的计数器添加引用;
  • Release:从计数器移除引用;

QueryInterface允许在组件实现的接口之间导航,而AddRefRelease则用于组件生命周期管理4

接口TIE

创建接口所需的第三个文件是通过代码构建器mkmk生成接口TIE。该文件是TIE_CAAIXX.tsrc文件,仅包含对CAAIXX.h文件的包含语句:

#include"CAAIXX.h"

TIE不属于对象模型概念,而是必要的实现细节。为了将接口与其实现分离,在运行时创建TIE对象实例作为中介对象,在使用接口的组件(因此持有指向该接口的指针)与实现接口的组件(即包含运行接口声明方法的代码)之间建立链接。接口指针实际上是指向QueryInterface方法返回的TIE对象实例的指针。TIE对象将接口方法调用重定向到实现接口的组件。

默认情况下,无论接口头文件位于何处,TIE文件都在ProtectedGenerated文件夹中创建。要在PublicGenerated文件夹中创建,请在tsrc文件中添加//public关键字:

#include"CAAIXX.h"//public

IUnknown与CATBaseUnknown

所有接口和所有实现接口的类的基类是CATBaseUnknown,这是CATIA提供的类。CATBaseUnknown派生自IUnknown接口(在UNIX上由CATIA提供,在Windows上由微软组件对象模型COM提供)。IUnknown接口如下:

interface IUnknown{virtualHRESULT __stdcallQueryInterface(constIID&iid,void**ppv)=0;virtualULONG __stdcallAddRef()=0;virtualULONG __stdcallRelease()=0;};

在CAAIXX的方法中,从IUnknown接口继承的这三个方法起着特殊作用:

  • QueryInterface:从指向同一组件实现的另一个接口的指针返回指向某个接口的指针
  • AddRef:为此接口的计数器添加引用
  • Release:从计数器移除引用

QueryInterface允许在组件实现的接口之间导航,而AddRefRelease则用于组件生命周期管理。

CATIA提供的IUnknown接口与COM中的完全相同,使接口可在UNIX和Windows之间移植。

CATBaseUnknownQueryInterfaceAddRefRelease方法提供了实现,这些方法由IUnknown作为纯虚函数暴露,从而避免在实现接口时重复实现这些方法,有助于代码复用。

所有接口都可以视为IUnknown接口,即可为每个接口使用IUnknown指针。这使得客户端应用程序可以从这样的IUnknown指针查询实现组件是否支持其他接口,并避免客户端应用程序管理指向这些实现对象的指针,而只需管理指向接口的指针。

小结

CATIA接口创建为从CATBaseUnknown派生的C++抽象类。接口TIE在运行时在使用接口的组件与实现接口的组件之间建立链接。

接口是接口开发者、实现接口的组件提供者以及使用该组件的客户端应用程序员之间的契约。接口不应随时间改变,使用这些接口的客户端应用程序在安装包含接口实现代码的新版本时绝不需要重新编译。

版本历史

版本:1 [2000年1月] 文档创建


  1. 什么是HRESULT? ↩︎

  2. 关于__stdcall ↩︎

  3. 关于全局唯一标识符 ↩︎

  4. 使用组件 ↩︎

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/3 1:30:47

宽带全息超表面模型的FDTD仿真与复现探索

宽带全息超表面模型 金属纳米孔 fdtd仿真 复现论文:2018年博士论文:基于纳米孔阵列超表面的全息显示技术研究 论文介绍:单元结构为金属纳米孔阵列,通过调整纳米孔的转角调控几何相位,全息的计算由标量衍射理论实现&…

作者头像 李华
网站建设 2026/4/1 0:21:42

探索MATLAB下冷热电气多能互补微能源网的稳健优化调度

MATLAB综合能源程序,对应文章《冷热电气多能互补的微能源网鲁绑优化调度》 针对综合能源系统,研究考虑碳排放的优化调度,建立风电光伏P2G燃气轮机等多能耦合元件的运行特性模型,电、热,冷,气多能稳态能流模…

作者头像 李华
网站建设 2026/3/25 6:05:59

Sentinel 网关流控实现原理

网关流量控制 Sentinel 支持对 Spring Cloud Gateway、Zuul 等主流的 API Gateway 进行限流。 Sentinel 1.6.0 引入了 Sentinel API Gateway Adapter Common 模块,此模块中包含网关限流的规则和自定义 API 的实体和管理逻辑: GatewayFlowRule&#xff…

作者头像 李华
网站建设 2026/3/25 12:26:41

探索 IEEE33 节点配电网模型:MATLAB 中的潮流与故障仿真之旅

IEEE33节点配电网模型,附带有详细节点数据以及文献出处来源,MATLAB,simulink各个版本均可运行,可以进行潮流计算以及四种常见故障波形仿真,可以更换线路模型,分布参数模型用于故障仿真(50km线路…

作者头像 李华
网站建设 2026/3/29 2:31:16

《程序化内容生成可控性与随机性平衡实操指南》

程序化内容生成的核心痛点从不是生成效率的提升,而是可控性与随机性的失衡带来的内容价值折损,这种折损在实际场景中往往以更隐蔽且致命的形式存在——可控过满时,内容会陷入机械复刻的同质化泥沼,比如同一主题的图文生成中,文案句式高度雷同、配图风格固化到一眼就能辨识…

作者头像 李华
网站建设 2026/3/26 14:51:51

OpenScenario场景仿真搭建:开启自动驾驶仿真新征程

OpenScenario场景仿真搭建 , OpenScenario是 自动驾驶仿真软件carla推出来的场景仿真标准,可配合carla一起完成整套自动驾驶的闭环仿真过程,将场景搭建变成可编程化的方式。 可以模拟出自动驾驶真实环境中出现的各种各样的路况环境&#xff0…

作者头像 李华