面向对象基本特性的C语言实现
第23卷第6期
2。02年11月微计算机应用MICROCOMPUTERAPI’LICATIONSV01.23,N。.6NoV・,2002
l
面向对象基本特性的C语言实现
张泰乐肖孙圣倪宏丌5)^
100080)(中国科学院研究生院,中国科学院声学所DSP中心北京
捕要:继承和多态性是面向对象程序语言的基本特征。本文通过对C语言的讨论・给出一种
用非面向对象程序语育实现这些特性的方法,并给出一个C语言的面向对象消息机制结构设计菜
单的具体实例。
关t词:面向对象C消息机制菜单设计
在类似于Psos、VxWorks等嵌入式多任务操作系统中,任务往往是依靠某种事件来驱动
的。利用一个循环,任务不断的等待任何可能的输入.然后做判断,再作出适当的处理。出
于兼容性或跨平台性的考虑,很多操作系统的内核采用非面向对象语言编写。为了降低成本,
很多操作系统的开发环境只提供C或其他非面向对象的语言,使得软件的可复用性和可维护
性比较差。
针对这个问题,本文提供了一种使用C语言实现面向对象基本特性的方法。用这种方法
编写的程序具有比较好的复用性,而且开发周期比较短,并可保持相对的稳定性。
l原理
面向对象的程序设计方法是一种基于结构分析的、以数据为中心的程序设计方法。在面
向对象的程序中,活动的基本单位是对象,向对象发送消息可以激活对象的行为。所以,面
向对象消息机制设计一对象+消息传递。
C语言虽然是一个面向过程的语言,它本身并没有提供面向对象的机制。但是通过合理的
利用C语言提供的一些机制,可以简单的模拟出种种面向对象的基本特性。
众所周知,一个对象就是客观实体的属性(数据)和行为(方法)的封装体。一般说来面向
对象的程序语言能够提供如下一些面向对象机制:①支持抽象数据类型;②行为的封装;③
继承;④多态性。
C语言中的结构体可以很容易的对具体的事物属性进行数据抽象。此外在结构体中只需
要加入函数指针,并在使用前将其赋予具体的函数,就可以实现行为的封装。需要注意的是,
这种解决办法需要在函数参数中加入一个指向结构体的本身的指针,这相当于c++中的
this指针。
由此可见,用非面向对象语育完成封装性质并不困难。以c为例,在结构(struct)之中放
置数据和处理数据的函数式的指针就可以得到某种程度的封装。面向对象语言的特有的性质
是继承。c语言的结构体是可以嵌套的。嵌套了其他结构体的结构体就拥有了被嵌套的结构体
的属性和方法。这样傲,就使得C程序中的结构体具有了简单的继承能力。
丰立f200204。02收到,2002—08—26收到修改稿
第6期微计算机应用369
建立一个基对象(baseobject),再从中衍化出派生对象(derivedobject),这只是在表面上
实现了继承,而不是继承的目的。继承的目的在于对象操作的一般化。所谓一般化,是指一
相同的指令调用了不同的函数,这种性质称为多态。这种做法的好处在于把各种已知和未知
的情况统统纳入考虑。c语言提供r指针的强制类型转换机制。如果将一个派生对象的指针强
制转换为基对象的指针。我们就可以用凋用基对象的函数来调用它的各种派生对象,从而实
现多态的目的。由于C语言的结构体类型指针的强制转换只是对指针所指向的内存从新定义
而已,所以在进行强制类型转化时必须把基对象放在派生对象结构体的第一行。
2实例
Psos是一种多任务实时操作系统,与很多多任务操作系统一样,Psos的程序是靠消息的
流动维护生命的。接触过WindowsSDK的人都知道,在非面向对象的程序中,程序依赖于一
个长长的switch/case结构进行处理。这种方法虽然直接,但是却不利于维护和修改。
在面向对象的程序设计中,消息交给当前活动的对象,并由其决定是否将此消息交给其
他对象处理。这里就牵涉到两个问题:消息函数的设计与消息流动的过程。为了能够使消息
处理函数具有一般化的特点,各对象应该具有相同的消息处理函数接口。这就要求每个对象
都继承来自同一个具有消息处理函数的共同基对象。
作为菜单程序,菜单的每一项具有共同的特点,就是响应用户的各种输入请求。从面向
对象设计的角度出发.菜单中所有的东西都被抽象成对象,屏幕是一个对象,子菜单是一个
对象,按钮是一个对象等等。把用户的输入看成是发给对象的消息。为了能够让采用共同的
接口来处理各种不同的用户输入,我们把用户输入抽象成一种结构体,并将这种用户输入结
构体的指针作为参数传给菜单中的各种对象。用户的输入设计如下:
typedefMESSAGE//用户输人的结构体}//这里放人各种不同的输人参数
』}MESSAGE,*pMESSAGE;{uasignedintlength//用户输入结构体的长度
在此基础上,我们把pMESSAGE类型的指针作为参数,传递给用户。设计一个具有处理
这种输入的参数的基对象,由它继承出各种各样的菜单对象,这样各种不同的对象都可以用
相同的指令来处理各种不同用户输入。很多情况下.一个消息需要牵涉到多个对象进行处理,
例如在退出子菜单时,就涉及到子菜单的退出处理和父菜单的更新等问题。为了能够让消息
在这些对象中流动,就必须在这个基对象中维护一条消息链。我们在基对象中加入指向下一
个消息处理对象的指针,这样就可以使得消息在各种对象之间流动了。简单的对象在属性和
行为上封装如下:
ypede[struct—OBJECT{//基对象
//指向下一个消息处理对象,用来维护消息处理链
void+pNextObject}
(*CallBackFunction)(void+pObject,MES—I}OBJECT.+pOBJECTSAGE+pMessage)//其他参数
对象的处理函数CallBaekFunetion的第一个输人参数pObject应该是指向消息处理对象
本身的指针,这样做的目的是为了提供类似C++中this指针的功能。各种对象都从此基本
对象中派牛,就都具有相同的接受用户输入的接IZl。
简单对象的继承。例如Button对象和子菜单对象定义如下:
‘’肚d。‘5’。““一Bu丁ToNi7/按钮f。BJEcTB85。d;//派生自基对象
2002年微计算机应用
一——————————————————————————————————————————————————————————————————一370
B001。bActiveFlaz;//是否活动『OBJECTBased;//N,*自基对象
//其他参数pMENUpLinkTo’
……!//其他参数
,BU’1’ToN,*DBUTTON;
lypedef{}SUBMENU,“pSUBMENU;struct—SUBMENU//于菜单
用类似的方法还可以定义菜单,屏幕等。通过这样的方法定义就可以用统一的语句来调
用实际上各种不同的函数。并且当需要修改或增加菜单时只需要修改和增加各个结构体和结
构体所指函数即可,而无需对程序的其他部分做出凋整。这样使得程序便于维护。
阋度发送给对象的消息代码如下:
v(JidxActiveOblect=8_screen;//屏幕if(((pOBJECT)pObjem)一)CallBackFunetion!=
NULL)//处理函数存在吗
if(((p0BJECT)pobJect)一>CallBackFunctlon(pOb—…//肚他的初婚化丁作//以F是具体的调度
while(MSGReceive(Message)){//等待用户消息
void*pObject=AetiveObject;//指向消息处理对
象
while(pObject!=NUI。L){//判断有无处理对象的
指针ject,糊Viessage))break;//女口果处理结束就退出pObject=((p0脚ECT)pObject)一>pNextObject;;//以上是强制类型转换和多态性质实现的例子
这种调度机制对各个具体对象是没有假设的,他们只需要有共同的接口就可以了,所以
代码的复用性可以得到大幅的提高。
程序在初始化结束后就一直等待用户消息输入,并一直处于挂起状态。接收到消息后,交
由各对象处理,并可完成在对象中的流动。等到消息处理完毕,程序会再次处于挂起状态,等
待下一次消息来驱动。
3结束语
在程序中采用封装、继承、多态性等面向对象的基本特性可以使得程序员主要关注所开
发程序的个性,其共性由程序封装完成,大大提高了程序的可复用性和可维护性。近两年在
渚如手机、信息家电等嵌入式系统中对人机界面的要求越来越复杂,然而现有的很多嵌入式
开发平台中还只能提供类似于C等非面向对象的开发语言。这种面向过程的传统开发方法很
难适应程序所提出的需求,并且这种程序不利于维护和二次开发。采用本文提供的方法可以
给程序一砦基本的面向对象特性,从而缓解这些矛盾。笔者在开发数字卫星接收机的菜单程
序时使川r上述的方法,目前此系统运行良好,取得了预期的效果。
参考文
5777献l供挫.深人浅ll;MFC.武汉:乍中辩技大学出版社.2001
2谭浩强(1程序i殳计.北京:清华太学出版社.1991.
3lh…uEckel.’lhinkinginJavaPrenticeHallPress.2000.38—48
面向对象基本特性的C语言实现
作者:
作者单位:
刊名:
英文刊名:
年,卷(期):
被引用次数:张泰乐, 肖孙圣, 倪宏中国科学院研究生院,中国科学院声学所DSP中心,北京,100080微计算机应用MICROCOMPUTER APPLICATIONS2002,23(6)3次
参考文献(3条)
1.侯捷 深入浅出 MFC 2001
2.谭浩强 C程序设计 1991
3.BRUCE ECKEL Thinking in Java 2000
相似文献(10条)
1.期刊论文 陶敏.陶石.Tao Min.Tao Shi 基于C++语言的面向对象的软件度量方法研究 -软件产业与工程2010,""(4)
本文重点介绍了Chidamber和Kemerer提出的面向对象软件设计软件度量学理论和方法,结合C++语言的特征.提出了一个针对C++的软件度量工具,提取程序中有关类、类成员、成员函数、对象等信息,从而计算出类的方法数、方法最大复杂度、继承树深度、孩子数目、耦合度等指标,帮助程序员掌握程序的复杂程度,指导软件开发过程.
2.期刊论文 饶俊文.朱宏明.RAO Jun-wen.ZHU Hong-ming 自动支持面向对象特性C程序的开发方案 -电脑知识与技术2008,4(35)
已有前人提出用C语言实现面向对象的方案,但它们都需要开发者人为提供支持面向对象的C语言框架,增加了开发者的负担.该方案用类C++语法编写初始代码,享受面向对象特性,而内部把初始代码自动转换成为支持面向对象特性的C代码,实现了面向对象理念和C语言的无缝对接.文章解析了用C语言实现面向对象的机制及代码转换机制,对比该方案和C++编程的效果,证实该方案的优越性.
3.学位论文 潘飚 C++语言面向对象的软件度量学研究 1999
该文主要研究C++语言面向对象的软件度量学特征及其度量工具的开发.软件度量学是软件工程的一个重要分支,其目的要从定量的角度来分析软件自身的特征,进而对软件质量进行整体的评价.
4.学位论文 陈伟锋 标准C的面向对象编程能力扩展 2005
随着嵌入式硬件的发展,嵌入式软件系统规模迅速膨胀,一方面过程式编程语言跟不上发展的需求,另一方面现有面向对象语言在嵌入式系统下的使用存在不少障碍.这些障碍产生于开发人员、开发工具、以及面向对象语言本身复杂性等.由于C1的高效、简洁、移植性强的特点,它目前仍然是嵌入式系统开发的首选高级语言.因此,很多嵌入式平台几乎都对C的开发有完善支持,比如交叉调试、变量查看和断点调试等.为了既能最大限度保持C的优点,又能最大限度利用原有嵌入式系统的开发资源进行面向对象编程,本论文在分析C如何映射面向对象编程语义的基础上,利用C的宏对C进行面向对象编程能力扩展,使C成为支持面向对象编程风格(paradigm)的Object-C宏语言.最后,通过Object-C的实例来验证其对面向对象编程风格的支持效果.论文一共分为六章:第一章论文的研究背景与意义,以及面向对象的主要特性与面向对象编程语言.第二章在考察编程风格的基础上,深入讨论如何映射C的编程语义到面向对象编程语义.第三章讨论对象模型及其元类实现方式,接着分析如何使用C的宏将C扩展为支持面向对象编程风格的Object-C宏语言.第四章为完善Object-C,讨论如何为Object-C增加诸如类型安全支持、内存泄漏检测等.第五章通过Object-C的测试实例,讨论Object-C对面向对象编程风格的支持效果.第六章Object-C的GUI开发实例与论文总结
5.期刊论文 王春江.钱若军.董石麟.赵金城 面向对象有限元方法及其C++实现 -上海交通大学学报2004,38(6) 系统归纳了面向对象有限元的基本理论和实现方法,比较了传统有限元实现方法与现代面向对象有限元方法的共同点及不同点.通过针对空间结构分析软件的基于统一建模语言(UML)的系统设计和运用C++语言实现面向对象有限元的程序框架,表明了面向对象有限元方法的先进性和基于C++语言实现的可行性.
6.学位论文 任凌燕 面向对象程序切片中类层次图的研究 2003
面各对象程序切片中类层次图的研究是该论文研究的课题,它是面向对象程序分析的一部分.该论文在研究现有的基于过程的程序切片和面向对象的程序切片的基础上,结合面向对象程序设计语言C++的特征,提出一种新的层次化切片C++程序的方法及其分层切片模型.通过构造类层依赖图、方法层依赖图和语句层依赖图,对C++程序进行分层切片.该论文设计和实现了C++程序的类层次图,为面向对象数据依赖分析和控制依赖分析提供上层框架.该类层次图有效的表示了类之间的继承和创建等基本的依赖关系,基本解决了C++程序表示中继承、多态等问题.同时,该论文对C++程序中嵌套类、友元、模板、结构、联合、局部类和名字空间等特征在类层次图中的表示提出了解决方案.
7.学位论文 肖侬 基于网络环境的面向对象语言C++并行化技术的研究与实现 1996
8.期刊论文 朱进.ZHU Jin 面向对象设计模式的C语言实现 -微机发展2005,15(11)
介绍了C语言成为嵌入式技术领域主要的程序设计语言的原因,及当前用C语言所编写的程序仍然存在的问题,然后介绍了面向对象的设计模式的概念及优点.并提出将面向对象的思想与C语言结合起来,接着用C语言实现了部分面向对象的设计模式,给出了其代码,并做了相应的注释,为优化C程序的结构提供了途径.最后总结了在C程序中使用这些设计模式的价值.文中所指的C语言均为标准C(ANSIC).
9.学位论文 张建军 一个面向对象的数据库管理系统核心及其C++接口 1995
10.学位论文 杨克敏 青鸟面向对象的逆向工程工具--JBRET/C++ 1997
该文讨论青鸟面向对象的逆向工程工具--JB Reverse Engineering Tool For C++(以后简称JBRET/C++)的开发背景、目的、 详细的设计和实现.JBRET/C++建立在C++程序理解的基础上,以项目作为分析单位,一个JBRET/C++项目包括一个或多个CPP文件以及这些CPP文件所依赖的H文件.通过信息提取器(由词法分析器和语法分析器组成),从这些CPP和H文件中获取类、对象以及它们之间相互作用的信息并保存到数据库中.当信息的获取完成后
辑器、信息提取器、信息数据管理器,OOD模型生成和编辑器.并提供了丰富的标识符查询和信息统计手段.
引证文献(3条)
1.汪冬.葛万成.宋春林.王云光 全自动生化分析仪控制系统建模及实现[期刊论文]-中国医疗器械杂志 2009(3)
2.饶俊文.朱宏明 自动支持面向对象特性C程序的开发方案[期刊论文]-电脑知识与技术 2008(35)
3.王海宽 DeviceNet现场总线协议研究及从站开发[学位论文]硕士 2005
本文链接:http://d.g.wanfangdata.com.cn/Periodical_wjsjyy200206013.aspx
授权使用:北京科技大学(bjkjdx),授权号:6fcbd840-9cc0-451c-9e0e-9e4000cef2f6
下载时间:2010年12月2日