最近过年在家,一直在想什么是面向对象,我是做嵌入式软硬件开发的,平时使用的最多的语言就是c语言,网上查资料都说c语言是面向过程的语言而非面向对象的语言,我对这句话一直一知半解,现在有了一些想法,现在记录下来。
STM32的HAL库、linux内核源码、STM32的标准库等大部分是面向过程的思维思维写成的,只有有少部分采用的面向对象的思维写的,也就是只有一小部分代码有"封装"、"继承"、"多态"的属性。
面向对象和面向方法分为两部分:第一部分是语言本身,另外一部分为编程思维。
第一部分语言本事:表现为各种编程语言的关键字,c89/c90标准一共32个关键字,都是用于类型定义、流程控制等,本身就是比较简单的都是过程控制相关的,因此说c语言是面向过程的语言。其他更加高级的语言本身有一些关键字就自带面向对象属性的例如C++中的public、private、class等。
第二部分编程思维:所谓的编程思维就是对事物数据以及行为的抽象,具体表现为"封装"、"继承"、"多态"。
c语言是面向过程的语言可以实现面向对象的思维。
下面主要从"面向对象的思维"出发分析一下如何用c语言实现"封装"、"继承"、"多态"
(1)c语言实现面向对象思想的"封装"
这里的"封装"不是使用结构体将事物的属性进行打包,而是在结构体内部新增定义函数指针的相关变量,将来函数指针绑定确定的函数名,当需要调用函数的时候采用"函数指针传参+解引用"的方式实现。因此,当我们遇到结构体类型定义内部有函数体指针的时候,就知道是面向对象的"封装"属性,而普通的结构体内部没有定义函数指针,也就不是面向对象思想了。
(2)c语言实现面向对象的"继承"。
这里的继承就是定义子结构体类型内部完整包含"父结构体类型变量",也就是子结构体这个内存变量本身是父结构体的一个成员变量,结构体变量包含结构体变量。这个在linux内核原理、stm32的HAL库函数中有大量应用。因此,当我们在阅读代码的时候遇到结构体内嵌结构体的时候,就知道是面向对象的"继承"属性。
(3)c语言实现面向对象的"多态"。
同一个函数名的函数调用,通过传递不同变量实现不同的行为。这就是为什么同一个函数名如果搜索函数调用的时候有至少2次以上函数调用的情况。最初的函数的目的抽象隐藏部分代码因为人脑容量是有限的,但是还有一部分代码抽象成的一类传参函数传递不同参数实现不同行为,因此在整个程序中被调用多次,这类函数可以归类为"多态"函数。