C语言实现面向对象设计

面向对象设计有诸多优势:可读性强,扩展性强,复用性强

面向对象语言有3大核心技术:

1、封装性
2、继承性
3、多态性

主流面向对象编程语言有:java ,c++ , python。很遗憾C语言并不是一个面向对象的语言,但是这并不影响C语言的强大,介绍两个C语言的强大的应用场景:操作系统内核设计,编译器设计。虽然C语言不是面向对象编程语言,但是通过一些设计技巧可以实现面向对象设计。接下来我们研究一下如何用C语言实现面向对象设计,本文将用JAVA语言和C语言进行讲解。

封装性

封装是面向对象编程的核心思想。方法和数据通过封装组成一个整体,封装实现了信息的隐藏(隐藏了数据和功能的实现细节),对象只能通过定义的方法与外界进行信息交流。

JAVA语言和C语言是如何定义一个类,如何封装数据和方法。

JAVA语言中通过类将数据和方法封装起来。接下来声明一个名为鸡的类,鸡类中内部包含两个变量:编号和重量,鸡类中实现3个函数:一个构造方法用于初始化鸡的编号和重量;一个给鸡喂食的方法,喂食后鸡的体重增加;一个查询鸡体重的方法。代码如下**(本文的代码具有连贯性,后面会引用前面的声明):**
在这里插入图片描述
C语言如何实现数据和方法的封装呢?我们可以使用结构体struct ,用C语言实现上述JAVA例程相同功能代码如下:
在这里插入图片描述
上述代码定义了一个结构体,结构体内部包含两个变量:编号和重量,同时还包含3个函数指针:初始化函数指针,喂食函数指针,查询重量函数指针。

JAVA语言和C语言是如何实例对象和操作对象。

JAVA语言实例对象和操作对象,JAVA语言中用new操作符来创建一个对象,创建对象后使用“对象.成员”来调用对象数据和方法,代码如下:
在这里插入图片描述
C语言实例对象和操作对象,C语言使用struct来创建一个对象,创建对象后需要对函数指针进行初始化,完成初始化的对象使用“对象.成员”来调用对象数据和方法,代码如下:
在这里插入图片描述
上述代码例程展示了JAVA和C如何定义一个对象,将数据和方法的封装在对象内部,同时也展示了实例对象和操作对象。

C语言结构体内部不能包含函数只能包含函数指针,因此C语言定义的类相当于JAVA语言中的抽象类。通过封装使得对象方法的工作具体细节对外不可见,外部只能通过调用对象的接口。这样就可以避免一个子系统依赖与另一个子系统。

继承性

继承是面向对象编程技术的一块基石。继承就是子类继承父类的特征和行为,使得子类对象具有父类的属性和方法,此外子类可以定义自己特有的属性和方法,即子类可以对父类进行扩展。继承技术使得程序架构具有一定弹性,增强了程序的复用性,提高了程序的扩展性。

JAVA语言和C语言是如何实现继承。

JAVA语言中通过extends实现继承,假设我们现在需要定义一个母鸡的类,母鸡属于鸡类,所以母鸡有鸡类的所有特性,除此之外母亲还有一个独有的特性:能下蛋。代码如下:
在这里插入图片描述
hen通过extends 继承了chicken的数据和方法,同时hen还定义了母鸡类的独有数据和方法。母鸡类有2个独有的变量:下蛋数量和饲养次数。母鸡类有2个独有的方法:饲养(经过3次饲养后母鸡增加一个蛋),查询下蛋总数的方法。

C语言中如何实现继承,代码如下:
在这里插入图片描述
C语言是通过在结构体内包含另外一个结构体实现继承。子类就完全拥有了父类的数据和方法,同时还能定义独有的数据和方法。

多态性

多态是同一个行为具有多个不同表现形式或形态的能力。多态就是指定义对象和方法在程序运行的不同时刻,可以绑定不同的具体类和具体方法,可以实现多种状态运行。多态性可以从两个方面体现:方法重载,类的上下转型。C语言不支持方法重载和上下转型。

抽象类和接口

JAVA中有两个重要的概念:抽象类,接口。

抽象类

抽象类中可以包含抽象方法(也可以不包含抽象方法),抽象类不能实例化,子类继承抽象父类时需要实现抽象父类中的抽象方法。C语言中定义的类中包含的方法都是抽象方法(函数指针),函数指针可以指向任意符合要求的函数,因此C语言定义的类属于抽象类,使用的时候需要实现函数指针需要指向的函数。

接口

接口类中只能包含抽象方法,接口可以实现多重继承。C语言中可以定义只包含抽象方法(函数指针)的类,C语言定义的类,可以实现多重继承,一个子类可以继承(包含)多个父类。

C语言中使用面向对象设计十分常见,经典例子就是linux中的虚拟文件系统(VFS)。

创作不易希望朋友们点赞,转发,关注。希望获取源码的朋友们在评论区里留言。
作者:李巍
Github:liyinuoman2017

Guess you like

Origin blog.csdn.net/li_man_man_man/article/details/121492088