龙空技术网

C语言实现面向接口编程

嵌入式工作室 915

前言:

如今同学们对“c语言实现虚函数”都比较看重,兄弟们都想要剖析一些“c语言实现虚函数”的相关知识。那么小编也在网络上搜集了一些关于“c语言实现虚函数””的相关文章,希望小伙伴们能喜欢,大家快快来了解一下吧!

大家好,我是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的。

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

标签: #c语言实现虚函数