C语言实现面向接口编程

本文介绍了面向接口编程的概念,将其与面向对象编程进行对比,并提供了一个C语言的Demo,展示了如何在嵌入式开发中使用面向接口编程来降低代码耦合。通过定义公共接口,实现了不同通信类型的处理,强调了接口在软件设计中的灵活性和可维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


正文


大家好,我是bug菌!

今天更新的文章,我相信是大伙喜欢的,来聊聊面向接口编程。

不是一直都吹嘘着面向对象编程吗?怎么今天又来一个面向接口编程,很多人要说我不讲武德了。

1

面向接口是啥?

不用慌,其实面向接口编程不是什么新鲜玩意,说得直白点就是函数指针的使用,不过我觉得可以形成一种编程的思想来指导嵌入式程序设计,特别是对于降低代码的耦合还是比较奏效的。

面向接口编程比面向对象要更牛吗?为什么不直接玩面向对象编程呢?

其实bug菌这么多年开发过来,真正把C完完全全用面向对象的方式进行编写是非常少的,像C++中的继承、多态、虚函数等等面向对象特性,如果均用C语言来维护和实现是非常复杂的,并且你还不能保证没有bug。

再说了你写了一堆代码让C的特性更加的像C++,那为什么不直接使用C++呢?难道你觉得那些特性你能用C写得比C++更好?别重复造轮子了。

不过,话说回来,能够在C语言中借鉴一些面向对象的语言特性和思想,确实能够让C代码更加的优雅和灵活,所以今天聊聊面向接口编程,它仅仅只是面向对象的一部分,不过在一般的嵌入式开发中使用性价比还是比较高的。

2

面向接口编程

话不多说,先上一个面向接口编程的Demo:

参考demo:

  1#include <stdio.h>
  2#include <stdlib.h>
  3
  4/********************************************
  5 * Note: 共用接口的定义 
  6 * author:bug菌 
  7 *******************************************/
  8struct Interface {
  9    int (*Initial)(void* handle);
 10    int (*Send)(void* handle,char * buff,int count);
 11    int (*Recv)(void* handle,char * buff);
 12    int (*Destory)(void* handle);
 13};
 14
 15 /********************************************
 16 * Note: 具体类型的定义 
 17 * author:bug菌 
 18 *******************************************/
 19typedef struct _tag_protocolType1 {
 20    struct Interface bi; //公共通信接口 
 21    char* CommTypeName; //通信名称 
 22    //不同通信类型的其他成员...... 
 23}protocolType1;
 24
 25
 26/********************************************
 27 * Note:其中一种报文协议的简单接口实现 
 28 * author:bug菌 
 29 *******************************************/
 30void protocol_Initial(void* handle)
 31{
 32   protocolType1* p = ( protocolType1*)handle;
 33    p->CommTypeName = "protocolType1"; //可以通过公共接口传参访问原对象的所有成员 
 34
 35    printf("%s Initial\n",p->CommTypeName);
 36} 
 37
 38void protocol_Send(void* handle,char * buff,int count)
 39{
 40    protocolType1* p = ( protocolType1*)handle;
 41
 42    printf("%s Send\n",p->CommTypeName);
 43} 
 44
 45void protocol_Recv(void* handle,char * buff)
 46{
 47    protocolType1* p = (protocolType1*)handle;
 48
 49    printf("%s Recv\n",p->CommTypeName);
 50} 
 51
 52void protocol_Destory(void* handle)
 53{
 54    protocolType1* p = (protocolType1*)handle;
 55
 56    printf("%s Destory\n",p->CommTypeName);
 57} 
 58
 59/********************************************
 60 * Note : 根据不同的类型,进行接口的初始化 
 61 * author : bug菌 
 62 *******************************************/
 63void Initial(struct Interface *pInterface,int type)
 64{
 65    pInterface->Initial  = protocol_Initial;
 66
 67    pInterface->Send     = protocol_Send;
 68
 69    pInterface->Recv     = protocol_Recv;
 70
 71    pInterface->Destory  = protocol_Destory;
 72
 73}
 74
 75/********************************************
 76 * Note :主题框架基本上不需要修改,这里只是简单示例,你可以更复杂 
 77 * author : bug菌 
 78 *******************************************/
 79void Process(struct Interface *pInterface)
 80{
 81    pInterface->Initial(pInterface);
 82
 83    pInterface->Send(pInterface,NULL,0);
 84
 85    pInterface->Recv(pInterface,NULL);
 86
 87    pInterface->Destory(pInterface);
 88
 89}
 90
 91
 92/********************************************
 93 * Note :应用程序 
 94 * author : bug菌 
 95 *******************************************/
 96int main(int argc, char *argv[]) {
 97
 98    protocolType1  protocol;
 99
100    Initial((struct Interface*)&protocol,1);
101
102    Process((struct Interface*)&protocol); 
103
104    return 0;
105}

运行结果:

分析一下:

对于一名合格的程序员,代码show出来,本文就没有写下去的必要了,不过为了全文的整体性,还是啰嗦几句。

其实面向接口编程所采用就是面向对象编程中的继承,只不过它把所有的公共接口全部抽象出来供框架程序进行调用。

这样当我们需要增加其他类型的对象处理时,可以通过构造并替换不同的接口函数来进行处理,从而使得整体程序改动最小。

凡是一种复用的架构都会牺牲一定的性能,不过也会增加程序的可维护性,降低程序的耦合度,如果你开发的项目并不是很复杂, 也确定了以后接口不会有新的变化,其实不使用接口也是OK的。

对于自动测试程序框架,接口的预留是非常重要的,可以通过虚拟接口来测试业务逻辑,能够模拟更多实际环境下不同的工况来进行测试。

2、最后

    创作不容易呀~ 你确定不给个赞再走?

推荐专辑  点击蓝色字体即可跳转

☞  MCU进阶专辑 

☞  嵌入式C语言进阶专辑 

☞  “bug说”专辑 

☞ 专辑|Linux应用程序编程大全

☞ 专辑|学点网络知识

☞ 专辑|手撕C语言

☞ 专辑|手撕C++语言

☞ 专辑|经验分享

☞ 专辑|电能控制技术

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

最后一个bug

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值