APP下载

ANSI-C实现面向对象编程及应用

2015-11-07辉,屈

咸阳师范学院学报 2015年6期
关键词:链表多态面向对象

赵 辉,屈 雷

(西安工程大学 电子信息学院,陕西 西安 710048)

C语言是在国内外广泛使用的一种高级编程语言[1]。其功能丰富、使用灵活方便、目标程序效率高、可移植性好,既具有高级语言的优点,又具有低级语言的诸多特性。因此,C语言特别适合用于编写系统软件[2],其中著名的Linux/Unix操作系统就是用C语言编写而成的[3]。

一般来说,C语言是以面向过程的方式进行编程的,用来编写功能复杂的软件是比较困难的[4]。而Linux/Unix操作系统却是使用C语言编写,并与面向对象程序设计的思想相结合[5],提升了C语言的简洁性、易读性和重复使用性,进而提高了系统分析及结构设计的能力[6]。这一例子说明,C语言其实也可以像C++一样以面向对象的方式进行编程。

本文将通过电子书软件来具体分析,如何使用面向对象编程中的一些机制来实现C语言的面向对象设计。

1 面向对象中各种机制

当人们提到面向对象的编程语言,首先想到的会是C++。在1985年以前,C++的名字是“C with Class”,从名字上可以看出C++最突出的特征就是类(Class);从另一种角度可以看出C++是C语言的有效扩充[7]。所以使用ANSI-C进行面向对象的编程,最基础的是类机制,而且还需要其他机制的支持。

1.1 类机制

“Class”是很多面向对象编程语言里定义类的关键字,它来源于最早的编程语言——smalltalk。类是一群具有共同属性的对象,说明了这群对象所具有的特征和行为。在程序中,数据表示对象的特征,函数表示对象的行为[4]。

类可以理解为用户定义的一种新的数据类型,就像是“short”这样的内置类型一样。内置类型已经有了一套完善的操作(如算数运算等),类机制也必须规定他所定义的类也能够进行操作,即对象的行为。在ANSI-C中并没有关键字“class”,但是可以使用结构体(struct)来定义一种新的数据类型,从而实现类。在结构体定义里,使用变量来描述对象的特征,并使用函数指针来描述对象的行为。

1.2 组合机制

面向对象程序设计的主要优点之一就是提供软件元素的重用。它提供了几种机制支持利用已有类来定义新类,新类可以获得已有类的特征和行为,进而实现类的重用。本文实现了一种比较简单的重用机制即组合。

组合(composition)表示的是两个对象之间获得一种包含关系,即一个对象包含或拥有另一个对象[8]。拥有其他对象的对象被称为组合体,它所拥有的对象被称为组件。这种关系在现实生活中是很普遍的:计算机包含处理器,书本包含文字等。组合使用ANSI-C实现是很简单的。

1.3 封装机制

封装(encapsulation)是面向对象的另一个重要概念。就是把特征和行为包围起来,对数据的访问只能通过特定的接口。事实上,封装就是用户对信息的隐藏,保证了模块具有较好的独立性,使得程序维护修改较为容易。对应用程序的修改仅限于类的内部,因而可以将应用程序修改带来的影响减少到最低限度[9]。

非 OOP(Object Oriented Programming)语言没有完备的机制来实现封装[6]。使用ANSI-C来实现封装稍微有些复杂。本文使用单向链表实现了对类中所有实例化的对象进行封装。

1.4 多态机制

多态(polymorphism)源于希腊语,意思的“多种形状”。在OOP语言中多态是指相关对象具有不同的成员函数(函数原型相同),并且允许对象与适当的成员函数运行时进行动态绑定[6]。多态保证了软件设计的重复使用。一般通过虚方法实现多态[10]。

一般情况下,我们使用ANSI-C编程,函数的原型是对应唯一的函数实现。而多态要求一个函数原型可以对应多个函数实现,这样可以便于管理功能相似的模块。如果前面提到的类机制、重用机制和封装机制都已经使用ANSI-C实现,再要实现多态机制就是非常简单的事情,使用函数指针抽象出统一的函数接口。

2 应用——电子书软件设计

整个软件使用了ANSI-C编写,采用上文所提到的面向对象的实现方法,并进行模块化分层设计。

2.1 电子书软件需求

(1)支持多种字体编码方式。文本文件一般有四种编码方式:ANSI、Unicode、Unicode big endian、UTF-8。程序需要根据文本文件的编码方式,自动选择解码函数。

(2)支持多种字体显示方式。常用的字体显示方式有GBK点阵和freetype矢量字体。程序需要根据字体设置,判断使用哪种方式显示文字。

(3)支持多种输入方式。常见的输入方式有键盘和触摸屏。程序要根据键盘的输入和触摸屏的滑动,实现翻页。

(4)支持多种设备显示。程序在PC机上运行是,使用PC机的显示器(CRT)。程序在ARM上运行时,使用ARM上的LCD显示器。

2.2 软件框架

根据电子书软件需求,将整个软件分3层。软件的层次关系及各功能模块构成如图1所示。面向对象的实现方法主要体现为4个基本的底层功能模块,每个模块分别有几种不同的实现方式。并由一个管理文件提供接口函数对不同的实现方式进行统一的操作。中间层为电子书页面管理模块,负责调用底层实现的接口函数实现了字体显示和页面操作以及相关的初始化。顶层为电子书管理模块,负责调用中间层实现的相关数据管理成个程序。

2.3 软件效果展示

(1)使用arm-linux-gcc工具链在Ubunut上编译,在飞凌的ok6410开发板上运行,结果如图2所示。

(2)首先在Ubunut上移植svgalib库,其次使用gcc在Ubunut上编译,最后在Ubunut上的tty控制台运行程序。结果如图3所示。

3 面向对象机制分析

电子书程序的代码量比较大,无法全部分析。本文将针对设备显示模块进行详细分析,具体如下。

图1 在ARM的LCD上显示的结果

3.1 类和组合机制分析

图2 在ARM的LCD上显示的结果

图3 在PC机的CRT上显示的结果

根据实验需求,本程序可以在PC机的CRT上显示,也可以在ARM的LCD上显示。所以我们需要操作的对象就是CRT和LCD。我们能够抽象出他们的共同特征和行为,得到一个具体类,使用结构体实现。具体代码如下,这部分定义在disp_manager.h头文件中:

其中T_Disp结构体是显示器固有属性的抽象,也是T_DispOpr类的一部分,这样就可以简单的实现ANSI-C中的类和组合机制。

3.2 类的实例化分析

根据上文产生的具体类,实例化为CRT和LCD对象,分别实现在crt.c和lcd.c文件中。一个C文件实现具体类的一个实例化,这样的模块化设计,使得程序进行添加和删除模块简单方便,更容易维护。由于对具体类的实例化是非常相似的,本文只对LCD对象的实例化进行具体分析,代码如下:

上面的代码给出了3个函数声明,具体的实现过程略。代码中使用了“static”关键字,说明定义的是静态函数和静态变量。这些函数和变量只能在本文件中被调用,这也是实现封装的基础。那么上层的函数怎么调用这些静态函数和静态变量?

3.3 封装机制分析

在lcd.c文件中需要有一个入口函数,以便实现其他文件对本文件中静态函数和静态变量的调用。代码如下:

其中RegisterDispOpr()函数将g_tLCDOpr结构体的地址注册到单向链表中。上层函数就是通过链表找到g_tLCDOpr结构体的入口地址,调用相关的函数及变量。实现了将具体类例化的对象封装到链表中。这个函数是在disp_manager.c文件中实现,而在这个文件中还需要实现一些操作链表的通用函数,方便上层函数调用。

3.4 多态机制分析

在lcd.c文件中

/*LCD设备初始化函数*/

.DeviceInit =LCDDeviceInit,

在crt.c文件中

/*CRT设备初始化函数*/

.DeviceInit =CRTDeviceInit,

程序在调用这个两个函数时,使用的是同一个接口 g_ptDispOpr->DeviceInit(),这就是多态的实现。程序先在链表中根据g_ptDispOpr->name查找,返回相应name的结构体的入口地址,进而就确定了g_ptDispOpr->DeviceInit()接口对应的是哪个具体的实现过程。

4 结论

如今嵌入式软件应用愈来愈广,软件的质量决定了数码产品的稳定性和可靠性。本文的实现的这些机制对于嵌入式软件编程是大有裨益。但是,对于大型的软件系统来说,本文实现的这些机制是远远不够的。可能还需要超类、继承、内存泄漏检测等机制的支持。

[1]黄俊爽,郭凌云,李燕杰,等.浅析C语言中常见错误[J].电脑知识与技术,2010(12):60.

[2]谭浩强.C语言程序设计[M].3版.北京:清华大学出版社,2005.

[3]丁慧.用C语言实现面向对象研究[J].淮海工学院学报:社会科学版,2010,8(12):61-63.

[4]曹烨.浅谈C语言与汇编语言混合编程的实现[J].科技信息:科学教研,2008(17):1001-9960.

[5]高焕堂.UML+OOPC嵌入式C语言开发精讲[M].北京:电子工业出版社,2008.

[6]陈飞,陈启安.面向对象的嵌入式系统开发技术[J].单片机与嵌入式系统应用,2005,5(9):15-18.

[7]LINDEN P V D,徐波.C专家编程[M].北京:人民邮电出版社,2002.

[8]LASZLO M J,杨秀梅,何玉洁,等.面向对象程序设计——图形应用实例[M].北京:机械工业出版社,2002.

[9]邓正宏,薛静,郑玉山.面向对象技术[M].北京:国防工业出版社,2004.

[10]丁智,王睿,高艳萍,等.标准C实现面向对象编程[J].江西科学,2009,27(5):733-736.

猜你喜欢

链表多态面向对象
参差多态而功不唐捐
基于二进制链表的粗糙集属性约简
跟麦咭学编程
基于MTF规则的非阻塞自组织链表
《C++面向对象程序设计》中引用类型的教学实践
C++的基于函数模板实现单向链表
面向对象Web开发编程语言的的评估方法
峰丛洼地农作物面向对象信息提取规则集
基于面向对象的车辆管理软件的研制与开发
人多巴胺D2基因启动子区—350A/G多态位点荧光素酶表达载体的构建与鉴定及活性检测