创建接口 【技术文章】
摘要本文介绍接口的概念。阐述了接口在对象建模器中的作用、组成结构及使用方法。CAA接口是什么面向对象设计及相关面向对象语言如C允许应用程序员通过类来描述和编码真实对象这些类包含结构部分数据成员和行为部分成员函数或方法。在C中类通过构造函数实例化使用这些类的应用程序员可以引用声明为公共的数据成员和方法在派生类构建新类时也可以使用声明为受保护的数据成员和方法。这是非常优秀的面向对象特性但当类的头文件发生变更时即使是私有部分的修改所有包含该文件的应用程序都必须重新编译。更通用的对象设计方法是通过行为来审视对象并仅使用方法描述行为这提供了把握对象的接口。对于应用程序员而言接口是对象的唯一可见部分隐藏了其实现细节这些细节完全由类提供者负责。接口构成了框架类开发者和应用程序员之间的契约。该契约包括要处理的现实世界对象、用于操作这些对象的方法以及调用这些方法的方式。这些内容不应随时间改变。仅允许进行添加操作基于框架开发的应用程序绝不应因框架修改而需要重新编译。实现接口是框架类开发者履行契约的方式。选择最合适的技术是其自主权必要时可以从一种技术切换到另一种技术而不会对应用程序产生影响。已提供的接口不应随时间改变。已提供的接口实现也应持续支持未变更的接口无需为客户端应用程序进行修改。如需修改如新的方法签名必须提供新接口。如需实现其他接口现有实现不应改变CAA提供了在不影响客户端应用程序的情况下扩展实现的方法。适用接口与实现分离的需求包括封装性对象仅暴露操作句柄而不暴露执行操作的内部机制多态性共享相同接口的对象可以被应用程序以相同方式处理即使这些对象以不同方式实现该接口继承性具有公共接口的对象可视为暴露这些公共接口的基对象的种类。这些对象派生自基对象并继承其接口构建独立性应用程序与其使用框架之间的耦合应尽可能弱。应用程序仅了解框架的接口实现修改不需要重新编译应用程序框架开放架构客户应能够实现框架接口并向现有实现添加新接口多重实现具有给定接口的框架应能将多个实现与该接口关联。多重实现可以是静态的顺序性或动态的同时性。静态多重实现意味着当前实现在特定时间切换为另一个实现例如适配新技术。动态多重实现允许多个实现同时共存并允许根据用户请求在实现间切换分布式对象架构框架的对象实例应能够由运行在不同进程可能在另一节点的对象服务器处理而非运行客户端应用程序的进程可能通过将对象请求发送给远程对象服务器的对象请求代理实现接口由什么构成示例接口CATIA接口创建为C抽象类因此仅包含纯虚方法。它由头文件、源文件和TIE文件组成。接口头文件以下是CAAIXX CATIA接口头文件示例#ifndefCAAIXX_h#defineCAAIXX_h#includeCATBaseUnknown.hexternExportedByCAADLL IID IID_CAAIXX;classExportedByCAADLLCAAIXX:publicCATBaseUnknown{CATDeclareInterface;public:virtualHRESULT __stdcallMXX1()0;virtualHRESULT __stdcallMXX2(CATBaseUnknown*pUnk)0;};#endif各语句作用如下接口头文件结构说明#ifndef、#define和#endif预处理器指令防止头文件被重复包含包含CATBaseUnknown头文件因为CAAIXX接口是从CATBaseUnknown派生的C抽象类任何接口都可通过声明为全局extern变量的标识符识别。该标识符必须唯一并将在接口源文件中初始化接口类必须从CATBaseUnknown或其他接口类派生。根据CATIA规则不支持多重继承宏CATDeclareInterface声明该类为CATIA接口方法具有以下特征所有方法必须是公共的因为任何接口方法都旨在被实现必须是纯虚函数即接口类不提供这些方法的任何实现必须返回HRESULT1。这是用于使接口符合OLE标准的微软返回码必须使用__stdcall调用约定2。这是微软对C编译器的扩展也用于使接口符合OLE标准可以包含参数通常是指向其他接口的指针接口源文件CAAIXX接口源文件如下#includeCAAIXX.hIID IID_CAAIXX{0x7c1b4ba8,0x5c25,0x0000,{0x02,0x80,0x02,0x0b,0xcb,0x00,0x00,0x00}};CATImplementInterface(CAAIXX,CATBaseUnknown);各语句作用如下接口源文件结构说明包含CAAIXX头文件以获取IID声明以及通过该头文件间接包含CATBaseUnknown头文件接口IID初始化为全球唯一且持久的数值。也称为GUID全局唯一标识符3宏CATImplementInterface声明CAAIXX从CATBaseUnknown进行对象模型派生。接口必须始终从CATBaseUnknown进行对象模型派生当然纯虚函数在声明它们的类中没有实现。在CAAIXX的方法中从接口IUnknown继承的三个方法CATBaseUnknown派生自IUnknown对接口起着特殊作用QueryInterface从指向同一对象实现的另一个接口的指针返回指向某个接口的指针AddRef为此接口的计数器添加引用Release从计数器移除引用QueryInterface允许在组件实现的接口之间导航而AddRef和Release则用于组件生命周期管理4。接口TIE创建接口所需的第三个文件是通过代码构建器mkmk生成接口TIE。该文件是TIE_CAAIXX.tsrc文件仅包含对CAAIXX.h文件的包含语句#includeCAAIXX.hTIE不属于对象模型概念而是必要的实现细节。为了将接口与其实现分离在运行时创建TIE对象实例作为中介对象在使用接口的组件因此持有指向该接口的指针与实现接口的组件即包含运行接口声明方法的代码之间建立链接。接口指针实际上是指向QueryInterface方法返回的TIE对象实例的指针。TIE对象将接口方法调用重定向到实现接口的组件。默认情况下无论接口头文件位于何处TIE文件都在ProtectedGenerated文件夹中创建。要在PublicGenerated文件夹中创建请在tsrc文件中添加//public关键字#includeCAAIXX.h//publicIUnknown与CATBaseUnknown所有接口和所有实现接口的类的基类是CATBaseUnknown这是CATIA提供的类。CATBaseUnknown派生自IUnknown接口在UNIX上由CATIA提供在Windows上由微软组件对象模型COM提供。IUnknown接口如下interface IUnknown{virtualHRESULT __stdcallQueryInterface(constIIDiid,void**ppv)0;virtualULONG __stdcallAddRef()0;virtualULONG __stdcallRelease()0;};在CAAIXX的方法中从IUnknown接口继承的这三个方法起着特殊作用QueryInterface从指向同一组件实现的另一个接口的指针返回指向某个接口的指针AddRef为此接口的计数器添加引用Release从计数器移除引用QueryInterface允许在组件实现的接口之间导航而AddRef和Release则用于组件生命周期管理。CATIA提供的IUnknown接口与COM中的完全相同使接口可在UNIX和Windows之间移植。CATBaseUnknown为QueryInterface、AddRef和Release方法提供了实现这些方法由IUnknown作为纯虚函数暴露从而避免在实现接口时重复实现这些方法有助于代码复用。所有接口都可以视为IUnknown接口即可为每个接口使用IUnknown指针。这使得客户端应用程序可以从这样的IUnknown指针查询实现组件是否支持其他接口并避免客户端应用程序管理指向这些实现对象的指针而只需管理指向接口的指针。小结CATIA接口创建为从CATBaseUnknown派生的C抽象类。接口TIE在运行时在使用接口的组件与实现接口的组件之间建立链接。接口是接口开发者、实现接口的组件提供者以及使用该组件的客户端应用程序员之间的契约。接口不应随时间改变使用这些接口的客户端应用程序在安装包含接口实现代码的新版本时绝不需要重新编译。版本历史版本1 [2000年1月] 文档创建什么是HRESULT? ↩︎关于__stdcall ↩︎关于全局唯一标识符 ↩︎使用组件 ↩︎

相关新闻

定义扩展特征【用户示例】

定义扩展特征【用户示例】

摘要 本文讨论CAAFmExtDefineExtensions用例。该用例详细说明了在特征目录中定义扩展特征所涉及的各个步骤。其前提条件是理解基本的特征建模器概念1、扩展特征2、特征启动项3以及创建启动项目录4。 通过此用例您将学到什么 在CAAFmExtDefineExtensions用例中,用…

2026/7/3 18:36:25 阅读更多 →
使用扩展特征【用户示例】

使用扩展特征【用户示例】

摘要 本文讨论了CAAFmExtExtensionManagement用例。它主要处理扩展特征的相关操作。这些扩展特征是在《定义扩展特征》1中定义的。 理解本用例的先决条件是理解扩展特征的概念2。 您将通过本用例学习什么 本用例教授用户如何操作扩展特征。主要学习内容如下: 为…

2026/7/6 4:58:34 阅读更多 →
理解扩展特征【技术文档】

理解扩展特征【技术文档】

摘要 本文详细介绍了将一个特征(称为基础特征)通过另一个特征(称为扩展特征)进行扩展的机制。 概念 一张解释概念的图片: 图.1 概念 基础特征可以是任何类型的特征,可以是达索系统的原始特征也可以是用户…

2026/7/5 22:15:46 阅读更多 →

最新新闻

建行龙支付回调验签与订单处理:5步解决 POST/GET 接收与数据验证

建行龙支付回调验签与订单处理:5步解决 POST/GET 接收与数据验证

建行龙支付回调验签与订单处理:5步解决 POST/GET 接收与数据验证支付回调环节是金融系统中最关键的"最后一公里",却往往成为开发者最容易踩坑的雷区。当用户完成支付后,如何确保回调请求的真实性?如何避免重复处理订单&…

2026/7/6 23:48:50 阅读更多 →
TPOT自动化机器学习:基于遗传编程的可解释pipeline优化

TPOT自动化机器学习:基于遗传编程的可解释pipeline优化

1. TPOT 是什么:一个会自己写代码的机器学习助手你有没有过这种体验:花一整天调参,把 Random Forest 的n_estimators从 100 试到 1000,把max_depth从 5 拉到 20,再换 SVM、XGBoost、LightGBM 轮流上阵,最后…

2026/7/6 23:46:47 阅读更多 →
AD74412R与MK64FN1M0VDC12在工业自动化中的高精度信号链设计

AD74412R与MK64FN1M0VDC12在工业自动化中的高精度信号链设计

1. AD74412R与MK64FN1M0VDC12的黄金组合解析在工业自动化和高精度测量领域,信号链的优化直接影响整个系统的性能表现。AD74412R作为ADI公司推出的四通道软件可配置I/O解决方案,与NXP的MK64FN1M0VDC12(Kinetis K64系列)微控制器组合…

2026/7/6 23:44:44 阅读更多 →
Next.js DApp 中间件层:钱包认证、路由守卫与 RPC 故障转移

Next.js DApp 中间件层:钱包认证、路由守卫与 RPC 故障转移

Next.js DApp 中间件层:钱包认证、路由守卫与 RPC 故障转移 一、前端直接裸连链上基础设施是一种不可持续的模式 一个典型的 Next.js DApp 启动流程通常是:安装 wagmi/ethers、配个 RPC URL、写个 useConnect,然后就开始写业务。这种模式在 D…

2026/7/6 23:42:42 阅读更多 →
电子表格条件函数实战指南:从IF到XLOOKUP的三层逻辑体系

电子表格条件函数实战指南:从IF到XLOOKUP的三层逻辑体系

1. 为什么你总在重复改表格?条件函数才是电子表格真正的“大脑”我带过不少刚转行做数据分析、财务或运营的朋友,他们第一次接触条件函数时,几乎都经历过同一个崩溃时刻:花两小时手动筛选、分类、打标签,结果发现隔壁同…

2026/7/6 23:42:42 阅读更多 →
Claude 4.7 Opus接入AWS Bedrock的Agentic Coding工程实践

Claude 4.7 Opus接入AWS Bedrock的Agentic Coding工程实践

1. 项目概述:这不是一次简单的API调用,而是一场对AI工程化边界的压力测试“Claude 4.7 Opus落地 AWS Bedrock”——这个标题里藏着三重现实张力。第一重是模型代际的跃迁:Opus作为Anthropic当前公开能力最强的闭源模型,其上下文窗…

2026/7/6 23:40:40 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性:5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域,单元测试是保证代码质量的重要环节。当应用涉及数据库操作时,测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南:告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况:下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/6 8:11:50 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/6 8:11:52 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/6 6:52:56 阅读更多 →

月新闻