记得还在我们大学C++第一门课的时候,老师就告诉我们说,C++是一门面向对象的语言。C++有三个最重要的特点,即继承、封装、多态。等到后来随着编码的增多和工作经验的积累,我也慢慢明白了面向对象的含义。可是,等我工作以后,使用的编程语言更多的是C语言,这时候我又想能不能把C语言变成面向对象的语言呢?等到后来通过思考和实践,我发现其实C语言也是可以面向对象的,也是可以应用设计模式的,关键就在于如何实现面向对象语言的三个重要属性。
(1)继承性
1 typedef struct _parent 2 { 3 int data_parent; 4 }Parent; 5 6 typedef struct _Child 7 { 8 struct _parent parent; 9 int data_child; 10 11 }Child;
typedef struct _parent { int data_parent; }Parent; typedef struct _Child { struct _parent parent; int data_child; }Child; 在设计C语言继承性的时候,我们需要做的就是把基础数据放在继承的结构的首位置即可。这样,不管是数据的访问、数据的强转、数据的访问都不会有什么问题。
(2)封装性
1 struct _Data; 2 typedef void (*process)(struct _Data* pData); 3 4 typedef struct _Data 5 { 6 int value; 7 process pProcess; 8 9 }Data; 10 struct _Data; 11 typedef void (*process)(struct _Data* pData); typedef struct _Data { int value; process pProcess; }Data;
封装性的意义在于,函数和数据是绑在一起的,数据和数据是绑在一起的。这样,我们就可以通过简单的一个结构指针访问到所有的数据,遍历所有的函数。封装性,这是类拥有的属性,当然也是数据结构体拥有的属性。
(3)多态
1 typedef struct _Play 2 { 3 void* pData; 4 void (*start_play)(struct _Play* pPlay); 5 }Play; 6 7 typedef struct _Play { void* pData; void (*start_play)(struct _Play* pPlay); }Play;
多态,就是说用同一的接口代码处理不同的数据。比如说,这里的Play结构就是一个通用的数据结构,我们也不清楚pData是什么数据,start_play是什么处理函数?但是,我们处理的时候只要调用pPlay->start_play(pPlay)就可以了。剩下来的事情我们不需要管,因为不同的接口会有不同的函数去处理,我们只要学会调用就可以了。
浙公网安备 33010602011771号