用 C 实现继承和多态 MIRO SAMEK 著 陈希明 译 虽然面向对象的设计并不会在很大程度上依赖于某种语言,但现代著作中提及面向对象的实现一般都认为是 C++, Smalltalk, 或者 Jav a。 本文从较底层的视角用面向过程的语言(比如 C)对面向对象予以实现,这对于一些想运用面向对象思想但又不想切换到面向对象语言的嵌入式开发者会起一定的指导作用。 有没有可能用像 C 语言这种非面向对象(non-OO)的语言写出面向对象(OO)的程序?在一个很小的,没有 C++编译器可用的嵌入式系统中怎样进行面向对象的程序设计? 怎样改进 C 语言开发的编程模式?怎样提高 C 语言代码的可重用性、模块化功能以及健壮性?继承和多态究竟是怎么实现的?你的系统能接受额外开销么?在用 C(而不是面向对象语言)进行面向对象的设计时,你应该怎样折衷地考虑便利性和可读性?在这篇文章中,我将使用下面这些面向对象的概念演示一个轻型的、高效的 C 语言程序,从而对这些问题展开讨论。 封装 — 把数据和函数打包进“类”,也就是信息隐藏和模块化。 继承 — 基于已经存在的类来定义新的类和方法的能力,这是为了代码的重用性和组织结构。 多态 — 同样的消息发送给不同的对象,而产生的行为应该依赖于接收到消息的对象的属性。 我采用 Jav a 语言来说明继承和多态[1]。继承类(或者继承的实现)仅仅是一个继承的模型,它是由位于类层次体系根节点的抽象类提供的。反过来,这种实现允许多继承,允许类实现许多个 Jav a-sty le 接口。 尽管面向对象语言具有很多无可置疑的优点,C 语言依然是最具知名度和使用最广泛的源代码语言。现在很多嵌入式系统并不提供其它语言的选择性,所以,大多数开发者依然仅仅使用面向过程的编程技术,而且很多人根本没有意识到在 C 语言中直接实现基本的面向对象概念是很容易的。建立这种意识很可能是重要的,原因有两个: 首先是面向对象技术的推动。大多数面向对象设计都能在 C 中实现,但很多开发者并不这样认为,因为 C 不具有面向对象语言的可行性。其实这种非必要性限制了面向对象技术的应用。 第二点是从面向过程到面向对象这种思维的平滑过渡。向面向对象技术的转移需要思维方式的跳跃。用你目前正在使用的而且很熟悉的语言来实现面向对象概念,这会给你一个立即完美地去接触全新编程模式的机会,而且不需要大的投入。 封装 在 C 中你可以通过这种方式将数据和...