版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、经常看到关于OO编程的讨论,C+, Java, C#.还有最近很流行的动态语言Python,Ruby等,但很少看到有C的份。在我看来,OO编程的核心是OO的思想,用什么语言倒是其次。但是,不可否认,那些专门为OO编程设计的语言可以比较方便和自然地表达OO思想,有些语言甚至强制使用OO特性。C,作为最贴近底层的高级语言,拥有简洁的语法和直接内存操作能力(指针),大量运用于系统级编程,如操作系统内核,驱动程序等。而在嵌入式系统中,由于资源有限等因素,更倾向于用C编程。C虽然在语言特性上并没有体现OO特性,但是依然可以通过各种编程技巧来体现OO的思想。由于C的高度自由的特点,在OO编程方面还能体现有
2、别于其他语言的特殊韵味。目 录 - 1. C的面向对象概念2. 3. 实现OO的继承机制C的面向对象概念OO Programing in C is not only POSSIBLE but also PRACTICAL.-OO思想在Unix世界中很早就有:UNIX把设备抽象成文件,这样就可以用一套相同的方法(open, read, write, close, . )去访问不同的设备和文件尽管设备之间的差异很大。用OO的观点来看,这些“设备”对象都实现了"文件操作接口",可以想象有一个叫"文件"的基类,定义了"文件操作接口",“设备”
3、对象继承了“文件”对象.。在实现角度看,在内核里面,设备驱动提供了自己的read, write等实现,并用它们去填充文件操作结构体里面的函数指针.这和C+里面的虚函数运行时绑定的道理是一样的。( C+虚函数是其实是运行时静态绑定,而文件操作接口可以运行时动态绑定 :-)Linux内核中则处处体现了OO的思想。2.6内核的Device Driver Modal是一套层次分明又错综复杂的机制,其中体现了许多OO设计理念。虽然可能设备驱动程序开发者觉察不到,但所有的设备驱动对象内部都隐藏了一个叫 KObject的对象。内核把这些KObjects互相联系在一起,并通过KObject的相互关系构造了/s
4、ys文件系统。/sys就是内核中各种设备对象的映射图,如果把/sys全部展开,我们可以清楚地看到各种对象的关系。实践证明,C也可以很好地用于OO编程,而且可以用于构造很复杂的系统,而且C在表达OO思想的时候并不会显得蹩脚,而是可以很简单,很自然。用struct来仿真classOO Programing in C is not only POSSIBLE, but also PRACTICAL.-“class“是很多OO编程语言里的关键字,它来源于OO鼻祖Smalltalk。class(类),是对一群有相同特性的对象的抽象概括,对象称为类的实例。在class里面可以存放有状态(变量),行为(函数
5、/方法).有关OO概念、方法的文章太多了,不再啰嗦。在C里面,唯一可以实现自定义类型的是struct,struct是C的OO编程最重要的工具。一个最常见的技巧,就是用struct来"仿真"class: 在struct里面放入变量,函数指针,嵌入其他struct等。以下例子摘自我最近刚开发完成的一个USB Firmware项目:C(在我的程序里,Mass storage对象和一个MMC Card对象绑定,外部存储是SD/MMC卡)。由于对于每一种设备的具体实现来说,它知道private指向的是何种类型的设备,因此不会引起混乱。而外部程序根据需要在初始化USB设备对象前赋予pr
6、ivate有意义的值运行时动态绑定。这一系列struct基本上如实地反映了USB DEVICE硬件逻辑和规范要求: "一个USB设备包含若干个端点,其中有一个固定的控制端点(端点0)。在枚举阶段USB设备要根据HOST的请求应答相应的描述符."现在回到OO的话题,这个例子中体现了"组合类":USB设备对象包含了USB端点对象,USB描述符对象.。还有动态绑定 (private成员)。从严格的OO意义上来看,好像有点"怪",不过我认为这恰恰是C的特点简洁,直接。不信你用C+表达试试?也许会更漂亮,很OO,但是不一定会如此清爽!P.S.
7、: 熟悉USB Firmware开发的人可能对struct usb_endpoint中的epx,cfg,bank和txCount四个成员有异议,因为这些成员是和特定的硬件相关,并不是所有的USB硬件都支持ping-pong mode,所以bank和txCount不一定用得上,epx, cfg也可能因硬件的不同而不同。没错!更理想的设计是把与硬件相关的部分分离出来,用void *private指向各自的与硬件相关的配置就像struct usb_device所采用方法,所以更好的版本应该是:tips: 用C表达的一个关键处就是要很好地应用struct来描述模型。实现OO的继承机制OO Progra
8、ming in C is not only POSSIBLE but also PRACTICAL-OO的一个亮点是类的"继承",通过"继承",可以重用许多代码。而且"继承"也是现实生活中非常自然的一种关系。但是很不幸,C没有class,更没有提供"继承"的表达方式。既然能用C的struct来仿真class, 那能不能继续来仿真"继承"呢?答案是:possible。就像<<Inside the C+ Object Modal>>书中所叙述的那样你可以用C来达到所有C+能做
9、到的事。但这种仿真显然毫无实际应用价值。"继承"是一种表达方式,代码重用才是目的。为了重用代码,C+可以用"继承"的方式来巧妙的达到目的,但是也必须付出代价:你必须非常仔细地设计你的类族谱,要有前瞻性,要有可扩展性,要决定分多少个层次.这些都不是容易做到的事。C别无选择,模块化设计,函数,宏.只能通过巧妙的设计才能达到代码可重用的目的。还是举个例子来说明C是如何做到"殊途同归"的吧。"链表"是一个非常常用的数据结构,常用于管理无序的数据(对象)集合。链表操作,特别是双向链表操作很容易出错。重用一套通用操作链表的代码可以为我们省不少事。在C+中,我们可以用经典的STL中的list类。为了适应各种数据类型,list类用模板来实现。list类实现的很巧妙,功能很强,但是,不得不说,很少人用。其实不仅list类很少用,STL都很少人用。(希望这是我的一家之言,反正我所熟悉的C+程序员都不怎么用STL :-)当然在C+中你还有另外一个选择:实现一个List基类完成链表操作,要放入链表的类从List类继承而来,就拥有了一套操作list
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 事业单位土木工程岗面试高频考题试卷及参考答案202
- 2027年备考会计基础 【零基础学员必练】押题练习试题(备用卷)含答案
- 2027年备考会计基础 【零基础学员必练】通关考试题库带答案解析
- 2026年湖南安全技术职业学院高职单招笔试英语历年参考题库含答案解析
- 2026年湖北艺术职业学院高职单招笔试英语历年参考题库含答案解析
- 2026年温州科技职业学院高职单招笔试职业适应性测验历年参考题库含答案解析
- 2026年海南政法职业学院高职单招笔试化学历年参考题库含答案解析
- 2026年济宁职业技术学院高职单招笔试职业适应性测验历年参考题库含答案解析
- 2026年泉州海洋职业学院高职单招笔试物理历年参考题库含答案解析
- 2026年河南林业职业学院高职单招笔试化学历年参考题库含答案解析
- 2026年医疗器械监督管理条例培训试卷附答案
- (正式版)DB14∕T 1324-2016 《公路桥梁预应力钢绞线局部释放法测试现存应力技术指南》
- 郑州网约车资格证模拟考试及答案
- 多资产配置全景研究系列控波御险:多资产组合风险管理方法论
- 2026年体育教研员竞聘题库(附答案)
- 水泥产品碳足迹核算报告
- 新版西师版五年级上册数学全册教案(完整版)教学设计含教学反思
- 电梯工程安装及后期保养合同三篇
- 人工智能驱动下的人才竞争力评价与专业演变研究
- 2025年正高面审答辩正高面审答辩重症医学笔试参考题库附带答案详解
- 工业网络和现场总线技术基础与案例
评论
0/150
提交评论