嵌入式C语言之面向对象设计—多态与虚函数表
在前两篇OOP基础内容里我们已经搞定了嵌入式外设的 封装 和 继承搭好了一套规范的设备数据结构。本篇就不再重复讲这些内容了直接聚焦工程中最头疼的问题 不同外设功能一样、但写法不一样怎么统一接口、解耦代码 带你吃透嵌入式OOP最后也是最核心的能力——多态。做项目我们会发现单个外设的驱动其实很好写真正难维护的是 多个功能相似、硬件不同的设备怎么用同一套上层代码去管控 。就拿我们常用的LED、蜂鸣器来说二者同属开关型输出设备对外操作指令完全一致但底层执行逻辑差异极大这就导致传统写法必然出现代码耦合、臃肿的问题。LED只需简单翻转GPIO电平即可完成状态切换而蜂鸣器为了保证人耳可识别需要开启后维持一段发声时长再自动关闭。这种 同操作、异逻辑 的场景是嵌入式开发的常态也是多态最核心的应用场景。如果不使用多态开发者只能依靠 if/else 、 switch 判断设备类型针对性执行不同逻辑。这种写法看似能用但最直观的问题就是 软硬强耦合 上层业务代码绑定底层硬件逻辑新增、修改设备都需要改动核心驱动代码违背开闭原则后期维护、迭代越改越烂。而 多态 就是用来解决这个问题的。在封装、继承的基础上多态实现了接口统一、实现不同三者搭配使用就能在嵌入式C语言中搭出一套完整、好用、可落地的面向对象驱动架构。一、无多态的代码通病被设备类型绑架的业务层还是用我们熟悉的LED、蜂鸣器案例带你直观感受传统写法的短板搞懂为什么必须用多态。1. 初期最简写法单设备无问题项目刚起步时一般就只用LED这一个设备不需要复杂判断#include#includestm32f4xx_hal.h// 初期仅支持LED设备统一开关逻辑voidoutput_dev_toggle(GPIO_TypeDef *port, uint16_t pin){HAL_GPIO_TogglePin(port, pin);}只有单个设备时这种写法完全够用简洁且无冗余问题。2. 迭代后写法但项目迭代后新增了蜂鸣器设备两个设备的翻转逻辑不一样代码就不得不加入大量设备类型判断开始逐步散发出腐败的味道// 设备类型枚举typedef enum{DEV_LED,DEV_BUZZER} OutputDev_Type;// 多设备迭代后的腐化写法voidoutput_dev_toggle(OutputDev_Type type, void *dev_param){switch (type){caseDEV_LED:{// LED纯电平翻转逻辑Led_Dev_t *led (Led_Dev_t *)dev_param;HAL_GPIO_TogglePin(led-port, led-pin);break;}caseDEV_BUZZER:{// 蜂鸣器翻转定时关闭逻辑Buzzer_Dev_t *buz (Buzzer_Dev_t *)dev_param;HAL_GPIO_TogglePin(buz-port, buz-pin);HAL_Delay(buz-beep_duration);HAL_GPIO_TogglePin(buz-port, buz-pin);break;}default:break;}}我们梳理下这种写法的 缺点 而多态的核心价值就是 上层只需要调用统一接口底层自动匹配对应设备的专属逻辑不用手动判断设备类型 。二、多态实现原生函数指针版多态前面通过继承我们解决了多设备数据冗余、结构不统一的问题但硬件设备的 行为差异 依旧没法处理。LED和蜂鸣器动作功能一致但底层执行代码不同这时候就可以用 函数指针 实现多态让同一套接口适配不同设备的专属行为。1. 升级基类绑定设备通用行为我们直接升级基类结构体在里面定义函数指针把所有输出设备通用的初始化、开启、关闭、翻转行为抽象出来。这里的 handle 参数作用和C的 this 指针一样用来绑定当前操作的设备对象保证每个设备独立控制、互不干扰。#include// 前向声明基类typedefstruct Output_Dev_t Output_Dev_t;// 升级版输出设备基类公共状态 通用行为函数指针struct Output_Dev_t{// 公共数据属性uint8_t dev_sta;GPIO_PinState active_lv;// 通用行为方法多态核心由子类实现差异化逻辑int (*dev_init)(Output_Dev_t *handle);int (*dev_on)(Output_Dev_t *handle);int (*dev_off)(Output_Dev_t *handle);int (*dev_toggle)(Output_Dev_t *handle);};2. 实现子类专属差异化行为逻辑接下来我们分别写LED、蜂鸣器的专属驱动逻辑。通过 向下类型转换 把基类指针转回对应子类指针就能正常读取每个设备独有的硬件参数实现差异化功能。/************************* LED设备专属实现 *************************/static int led_dev_init(Output_Dev_t *handle){Led_Dev_t *obj (Led_Dev_t *)handle;if(obj || obj-port )return -1;handle-dev_sta 0;HAL_GPIO_WritePin(obj-port, obj-pin, !handle-active_lv);return 0;}static int led_dev_on(Output_Dev_t *handle){Led_Dev_t *obj (Led_Dev_t*)handle;HAL_GPIO_WritePin(obj-port, obj-pin, handle-active_lv);handle-dev_sta 1;return 0;}static int led_dev_off(Output_Dev_t *handle){Led_Dev_t *obj (Led_Dev_t*)handle;HAL_GPIO_WritePin(obj-port, obj-pin, !handle-active_lv);handle-dev_sta 0;return 0;}static int led_dev_toggle(Output_Dev_t *handle){Led_Dev_t *obj (Led_Dev_t*)handle;HAL_GPIO_TogglePin(obj-port, obj-pin);handle-dev_sta !handle-dev_sta;return 0;}/************************* 蜂鸣器设备专属实现 *************************/static int buzzer_dev_init(Output_Dev_t *handle){Buzzer_Dev_t *obj (Buzzer_Dev_t *)handle;if(obj || obj-port )return -1;handle-dev_sta 0;HAL_GPIO_WritePin(obj-port, obj-pin, !handle-active_lv);return 0;}static int buzzer_dev_on(Output_Dev_t *handle){Buzzer_Dev_t *obj (Buzzer_Dev_t *)handle;HAL_GPIO_WritePin(obj-port, obj-pin, handle-active_lv);handle-dev_sta 1;return 0;}static int buzzer_dev_off(Output_Dev_t *handle){Buzzer_Dev_t *obj (Buzzer_Dev_t *)handle;HAL_GPIO_WritePin(obj-port, obj-pin, !handle-active_lv);handle-dev_sta 0;return 0;}static int buzzer_dev_toggle(Output_Dev_t *handle){Buzzer_Dev_t *obj (Buzzer_Dev_t *)handle;if(handle-dev_sta 0){buzzer_dev_on(handle);HAL_Delay(obj-beep_time);buzzer_dev_off(handle);}else{buzzer_dev_off(handle);}return 0;}3. 构造函数绑定对象行为激活多态我们写一个设备构造初始化函数把上面写好的专属驱动逻辑绑定到对应设备对象的函数指针上这样每个设备就拥有了自己的专属行为多态能力也就正式激活了。// LED设备构造初始化staticvoidled_dev_ctor(Led_Dev_t *obj, GPIO_TypeDef *port, uint16_t pin, GPIO_PinState active_lv){if(obj || port )return;// 绑定行为函数obj-base.dev_init led_dev_init;obj-base.dev_on led_dev_on;obj-base.dev_off led_dev_off;obj-base.dev_toggle led_dev_toggle;// 绑定硬件参数obj-base.active_lv active_lv;obj-port port;obj-pin pin;obj-base.dev_sta 0;}// 蜂鸣器设备构造初始化staticvoidbuzzer_dev_ctor(Buzzer_Dev_t *obj, GPIO_TypeDef *port, uint16_t pin, GPIO_PinState active_lv, uint16_t beep_time){if(obj || port )return;// 绑定行为函数obj-base.dev_init buzzer_dev_init;obj-base.dev_on buzzer_dev_on;obj-base.dev_off buzzer_dev_off;obj-base.dev_toggle buzzer_dev_toggle;// 绑定硬件参数obj-base.active_lv active_lv;obj-port port;obj-pin pin;obj-beep_time beep_time;obj-base.dev_sta 0;}4. 多态效果上层统一无差别调用到这里就能看到多态最直观的好处上层代码只需要操作基类指针完全不用管当前是LED还是蜂鸣器统一调用接口底层自动匹配逻辑不再需要繁琐的设备类型判断。int main(void){// 定义两类不同外设Led_Dev_t led1;Buzzer_Dev_t buz1;Output_Dev_t *dev_base;// 初始化各类设备led_dev_ctor(led1, GPIOA, GPIO_PIN_0, GPIO_PIN_SET);buzzer_dev_ctor(buz1, GPIOB, GPIO_PIN_1, GPIO_PIN_SET, 500);// 多态调用同一接口不同设备不同逻辑dev_base (Output_Dev *)led1dev_base-dev_init(dev_base);dev_base-dev_toggle(dev_base);dev_base (Output_Dev *)buz1dev_base-dev_init(dev_base);dev_base-dev_toggle(dev_base);while(1){}}到这里 最简版函数指针多态 就实现完成了。同一套调用代码绑定不同设备对象就能自动执行不同的驱动逻辑很好地解决了多设备分支代码臃肿、腐化的问题。四、多态升级标准虚函数表上面这种写法能用但不够优雅还存在明显的内存浪费问题每个设备实例都会单独存储一套完整的函数指针哪怕是同类型设备函数逻辑也完全相同会重复占用内存。举个很直观的例子我们的硬件板卡上通常不止一个LED比如状态LED、电源LED、故障提示LED假设项目中定义了 4 个LED设备对象。这4个LED的初始化、点亮、熄灭、翻转逻辑完全一模一样但用上面的写法每创建一个LED对象就会多存一套相同的函数指针相当于4份一模一样的代码配置重复占用RAM设备数量越多无效内存损耗越严重对于RAM资源紧张的单片机来说非常不划算。所以更优雅做法是 抽离虚函数表 同一种类的设备共用一张行为方法表每个设备对象只保留一个虚表指针指向对应的方法表。Linux内核、各类RTOS、LVGL等主流嵌入式框架全都是这套 vtable 架构。1. 定义输出设备虚函数表我们先定义统一的虚函数表把所有输出设备的通用行为全部收拢进来作为所有设备的通用方法模板实现统一管理、全局共享。// 前向声明基类typedefstruct Output_Dev_t Output_Dev_t;// 输出设备虚函数表存储通用设备行为全局共享、只读存储typedefstruct{int (*dev_init)(Output_Dev_t *handle);int (*dev_on)(Output_Dev_t *handle);int (*dev_off)(Output_Dev_t *handle);int (*dev_toggle)(Output_Dev_t *handle);} Output_VTable;2. 进阶版基类模型vptr标准架构接着重构基类结构不再单独存放零散的函数指针只保留 虚表指针(vptr) 和 设备公共状态 。这种写法能减少设备对象的内存占用。// 最终版输出设备基类工程标准OOP模型structOutput_Dev_t{const Output_VTable *vptr; // 虚表指针指向当前设备类型的专属方法表uint8_t dev_sta; // 设备状态GPIO_PinState active_lv; // 有效触发电平};这套架构的核心优势非常贴合单片机场景虚表加上 const 修饰后会直接存放在Flash中 完全不占用RAM 每个设备对象仅需一个指针大小的内存即可。3. 绑定各设备专属虚函数表我们复用前面写好的LED、蜂鸣器驱动逻辑为每一类设备单独创建一张专属虚函数表做到一类设备、一张虚表、全局唯一。// LED设备专属虚函数表Flash常量存储staticconstOutput_VTable g_led_vtable {.dev_init led_dev_init,.dev_on led_dev_on,.dev_off led_dev_off,.dev_toggle led_dev_toggle};// 蜂鸣器设备专属虚函数表Flash常量存储staticconstOutput_VTable g_buzzer_vtable {.dev_init buzzer_dev_init,.dev_on buzzer_dev_on,.dev_off buzzer_dev_off,.dev_toggle buzzer_dev_toggle};4. 升级构造函数绑定虚表完成动态类型注册最后升级设备构造函数在设备初始化时绑定对应的虚表指针。设备在初始化阶段就确定了自己的专属行为逻辑程序运行时自动匹配无需编译期固化任何设备判断代码。// LED设备构造初始化staticvoidled_dev_ctor(Led_Dev_t *obj, GPIO_TypeDef *port, uint16_t pin, GPIO_PinState active_lv){if(obj || port )return;obj-base.vptr g_led_vtable; // 绑定LED专属虚表obj-base.active_lv active_lv;obj-base.dev_sta 0;obj-port port;obj-pin pin;}// 蜂鸣器设备构造初始化staticvoidbuzzer_dev_ctor(Buzzer_Dev_t *obj, GPIO_TypeDef *port, uint16_t pin, GPIO_PinState active_lv, uint16_t beep_time){if(obj || port )return;obj-base.vptr g_buzzer_vtable; // 绑定蜂鸣器专属虚表obj-base.active_lv active_lv;obj-base.dev_sta 0;obj-port port;obj-pin pin;obj-beep_time beep_time;}这就是多态的 动态绑定核心 初始化绑定虚表、确定设备行为运行时通过 vptr 自动匹配驱动函数。5. 封装上层统一通用接口我们再封装一层全局统一接口给上层业务调用。让上层代码去隔离底层硬件差异后续新增同类输出设备完全不用修改上层业务代码符合开闭原则。// 统一设备初始化接口staticintoutput_dev_init(Output_Dev_t *handle){if((handle ) || (handle-vptr ) || (handle-vptr-dev_init ))return-1;return handle-vptr-dev_init(handle);}// 统一设备开启接口staticintoutput_dev_on(Output_Dev_t *handle){if((handle ) || (handle-vptr ) || (handle-vptr-dev_on ))return-1;return handle-vptr-dev_on(handle);}// 统一设备关闭接口staticintoutput_dev_off(Output_Dev_t *handle){if((handle ) || (handle-vptr ) || (handle-vptr-dev_off ))return-1;return handle-vptr-dev_off(handle);}// 统一设备翻转接口staticintoutput_dev_toggle(Output_Dev_t *handle){if((handle ) || (handle-vptr ) || (handle-vptr-dev_toggle ))return-1;return handle-vptr-dev_toggle(handle);}6. 最终标准多态调用演示int main(void){// 定义并初始化各类输出设备Led_Dev_t led1;Buzzer_Dev_t buz1;led_dev_ctor(led1, GPIOA, GPIO_PIN_0, GPIO_PIN_SET);buzzer_dev_ctor(buz1, GPIOB, GPIO_PIN_1, GPIO_PIN_SET, 500);// 上层统一接口多态调用无任何设备类型判断output_dev_init((Output_Dev *)led1);output_dev_toggle((Output_Dev *)led1);output_dev_init((Output_Dev *)buz1);output_dev_toggle((Output_Dev *)buz1);while(1){}}六、C语言OOP完整复盘到这里结合前两篇内容我们就完整搭好了 封装-继承-多态 的嵌入式C语言OOP闭环架构。首先是封装把单个外设的状态、硬件参数全部收拢到结构体中用对象管控设备的整个生命周期干掉零散的全局变量让单设备驱动代码规范、整洁、好维护。然后是继承这部分前文已经讲得很细致了简单总结通过结构体嵌套实现继承统一多设备的数据结构消除重复代码为多态实现打好结构基础。最后是多态依靠函数指针实现简易多态依靠虚函数表实现标准多态。核心价值就是 上层接口统一底层实现差异化 解决代码耦合问题让项目更好扩展、更好维护。最后请记住C语言模拟OOP是 服务于项目的手段 不是用来炫技的语法千万不要无脑过度设计以下三条你可以参考当你能深入理解嵌入式C里面的封装、继承、动态的思想那么我相信后续的各种复杂驱动框架你也能快速领会万变不离其宗。【往期精选】你的 C 代码为什么乱看完这 18 种结构体用法就懂了嵌入式驱动架构进化全解从 51 裸机到 Linux 设备树吃透结构体对齐解决嵌入式 90% 的偶发玄学 BUG一文吃透嵌入式编译链接全过程彻底弄懂内存段布局与分区原理嵌入式架构到底该怎么分层、怎么设计接口嵌入式事件驱动架构回调函数从入门到精通嵌入式 MCU 固件升级全实战总结高效处理流数据的利器环形缓冲区Ring Buffer实现详解

相关新闻

C语言推箱子游戏开发:从控制台字符到核心逻辑的完整实现

C语言推箱子游戏开发:从控制台字符到核心逻辑的完整实现

1. 项目概述:从字符到逻辑,理解推箱子游戏的核心最近在整理硬盘里的老项目,翻出来一个大学时期用C语言写的推箱子游戏。看着那满屏的控制台字符和现在看来略显稚嫩的代码结构,不禁感慨,这玩意儿还真是学习C/C编程的绝佳…

2026/8/9 6:37:04 阅读更多 →
颠覆性浏览器资源捕获革命:猫抓Cat-Catch如何重新定义Web媒体生态

颠覆性浏览器资源捕获革命:猫抓Cat-Catch如何重新定义Web媒体生态

颠覆性浏览器资源捕获革命:猫抓Cat-Catch如何重新定义Web媒体生态 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 在当今流媒体主导的数…

2026/8/9 6:37:04 阅读更多 →
5分钟掌握XUnity.AutoTranslator:Unity游戏实时翻译插件完全指南

5分钟掌握XUnity.AutoTranslator:Unity游戏实时翻译插件完全指南

5分钟掌握XUnity.AutoTranslator:Unity游戏实时翻译插件完全指南 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator XUnity.AutoTranslator是一款功能强大的Unity游戏实时翻译插件,能…

2026/8/9 6:37:04 阅读更多 →

最新新闻

Godot 4开发Roguelike卡牌游戏:从架构到实战

Godot 4开发Roguelike卡牌游戏:从架构到实战

1. 项目概述:为什么选择Godot 4来构建你的卡牌构筑Roguelike? 如果你对《杀戮尖塔》、《怪物火车》这类游戏着迷,同时又对Godot引擎的强大与轻量有所耳闻,那么“用Godot 4制作一个Roguelike卡牌构筑游戏”这个想法,很可…

2026/8/9 9:43:24 阅读更多 →
如何快速实现专业级音乐分离:OpenVINO AI插件的完整指南

如何快速实现专业级音乐分离:OpenVINO AI插件的完整指南

如何快速实现专业级音乐分离:OpenVINO AI插件的完整指南 【免费下载链接】openvino-plugins-ai-audacity A set of AI-enabled effects, generators, and analyzers for Audacity. 项目地址: https://gitcode.com/gh_mirrors/op/openvino-plugins-ai-audacity …

2026/8/9 9:43:24 阅读更多 →
SMUDebugTool终极指南:AMD Ryzen系统调试与优化的完整教程

SMUDebugTool终极指南:AMD Ryzen系统调试与优化的完整教程

SMUDebugTool终极指南:AMD Ryzen系统调试与优化的完整教程 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https:…

2026/8/9 9:43:24 阅读更多 →
Unity风格化天气系统CSW2:从原理到实践的完整指南

Unity风格化天气系统CSW2:从原理到实践的完整指南

1. 项目概述:为什么我们需要一个风格化的天气系统? 在Unity项目里鼓捣过天气效果的朋友,大概都经历过这么几个阶段:一开始,觉得用粒子系统做个雨雪,调个天空盒颜色,就算有天气了。然后发现&…

2026/8/9 9:43:24 阅读更多 →
从串口到MQTT:设备协议升级与兼容性适配实战

从串口到MQTT:设备协议升级与兼容性适配实战

在实际项目开发中,我们经常需要处理一些具有特定编码或标识的硬件设备、软件模块或数据协议。这些标识,如“C-324”、“MC-512”,往往代表了产品的型号、版本或特定的功能集。当遇到一个被称为“水平版C-324”或“Level MC-512”的新版本&…

2026/8/9 9:43:24 阅读更多 →
JNPF低代码平台架构演进:从单体到云原生微服务的复杂业务实践

JNPF低代码平台架构演进:从单体到云原生微服务的复杂业务实践

1. 项目概述:当低代码遇上复杂业务 几年前,当“低代码”这个概念刚火起来的时候,我和很多同行一样,觉得这玩意儿不就是个高级点的表单设计器嘛,搞搞OA审批、做个简单的数据收集还行,真碰上核心业务系统&…

2026/8/9 9:42:24 阅读更多 →

日新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/9 0:01:47 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/9 0:01:47 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/9 0:03:48 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/9 0:01:47 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/9 0:01:47 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/9 0:03:48 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/8 17:02:44 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/9 0:45:04 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/8 17:02:44 阅读更多 →