感触C语言中的面向对象思想

经常听见别人说面向对象的程序设计,以前也有上过面向对象程序设计这门课。可是不幸的是,这些都是以C++,甚至VC++为基础的。而更加不幸的是,多年以来我一直是一个C的使用者。在学校的时候,我主要做的是硬件上的驱动层,和底层功能层。

在工作以后,又做的是手机上的软件开发,所有这些都是和C离不开的。虽然我不得不说,C++是一门很好的语言,但是它的编译速度,代码效率,编译后的代码大小都限制了它在嵌入式上的应用。(尽管现在的嵌入式CPU越来越快,内存容量变大,我觉得用C++也应该没有什么问题。这使我觉得似乎是嵌入式编译器的限制。虽然菲利普和TI好像都有C++的编译器,但是似乎没人用这个。难道是太贵了?但不管怎么说,嵌入式应用中,C语言的普遍使用是肯定的)

那么在面向过程的时代产生的C语言能否使用面向对象的思想呢?我认为是肯定可以的,C++不过是在语言级别上加入了对对象的支持,同时提供了丰富的对象库。而在C语言下,我们只好自力更生了。

一、 面向对象思想的目的是框架化,手段是抽象

相信很多人都明白面向对象讲了什么:类,抽象类,继承,多态。但是是什么原因促使这些概念的产生呢?

打个比方说:你去买显示器,然而显示器的品牌样式是多种多样的,你在买的过程中发生的事情也是不可预测的。对于这样的事情,我们在程序语言中如何去描述呢。面向对象的思想就是为了解决这样的问题。编写一个程序(甚至说是一个工程),从无到用是困难的,从有到丰富是更加困难的。面向对象将程序的各个行为化为对象,而又用抽象的办法将这些对象归类(抽象),从而将错综复杂的事情简化为几个主要的有机组合(框架化)。

其实我们的身边很多东西都是这样组成的:比如说电脑:电脑是由主板,CPU加上各种卡组成的。这就是一个框架化。而忽略不同的CPU,不同的主板,不同的声卡,网卡,显卡的区别,这就是抽象。再比如说现在的教育网:是由主核心节点:清华,北大,北邮等几个,然后是各个子节点,依次组成了整个教育网网络。

所以我觉得面向对象的编程思想就是:一个大型工程是分层次结构的,每层又由抽象的结构连接为整体(框架化),各个抽象结构之间是彼此独立的,可以独立进化(继承,多态)。层次之间,结构之间各有统一的通讯方式(通常是消息,事件机制)。

二、以前C语言编程中常用的“面向对象”方法

其实C语言诞生以来,人们就想了很多办法来体现“面向对象”的思想。下面就来说说我所知道的方法。

1.宏定义:

有的人不禁要问,宏定义怎么扯到这里来了,我们可以先看一个简单的例子:

#define MacroFunction Afunction

然后在程序里面你调用了大量的AFunction,但是有一天,你突然发现你要用BFunction了,(不过AFunction又不能不要,很有可能你以后还要调用),这个时候,你就可以#define MacroFunction Bfunction来达到这样的目的。

2.静态的入口函数,保证函数名相同,利用标志位调用子函数:

这样的典型应用很多,比如说网卡驱动里面有一个入口函数Nilan(int FunctionCode,Para*)。具体的参数是什么记不清楚了。不过NiLan的主体是这样的:

Long Nilan(int FunctionCode,Para*)
{
Switch(FunctionCode)
{
Case SendPacket:
send(….)
Case ReceivePacket:
receive(…)
…..
   }


写到这里大家明白什么意思了吧。保证相同的函数名就是说:网卡驱动是和pNA+协议栈互连的,那么如何保证pNA+协议栈和不同的驱动都兼容呢,一个简单的办法就是仅仅使用一个入口函数。通过改变如果函数的参数值,来调用内部的各个函数。

这样的做法是可以进化的:如果以后想调用新的函数,增加相应的函数参数值就好了。如果我们将网卡驱动和pNA+协议栈看作两个层的话,我们可以发现:层与层之间的互连接口是很小的(这里是一个入口函数),一般是采用名字解析的办法而不是具体的函数调用(利用FunctionCode调用函数,Nilan仅仅实现名字解析的功能)――!接口限制和名字解析

接口限制:层与层之间仅仅知道有限的函数

名字解析:层与层之间建立共同的名字与函数的对应关系,之间利用名字调用功能。

3.CALLBACK函数

我觉得这是C语言的一个创举,虽然它很简单,就象如何把鸡蛋竖起来一样,但是你如果没想到的话,仍然是一个难题。如果说静态入口函数实现了一个可管理的宏观的话,CallBack就是实现了一个可进化的微观:它使得一个函数可以在不重新编译的情况下实现功能的添加!但是在最最早期的时候,也有蛮多人持反对态度,因为它用了函数指针。

函数指针虽然灵活,但是由于它要访问内存两次才可以调用到函数,第一次访问函数指针,第二次才是真正的函数调用。它的效率是不如普通函数的。但是在一个不太苛刻的环境下,函数调用本身就不怎么耗时,函数指针的性能又不是特别糟糕,使用函数指针其实是一个最好的选择。

但是函数指针除了性能,最麻烦的地方就是会导致程序的“支离破碎”。试想:在程序中,你读到一个函数指针的时候,如果你愣是不知道这个函数指针指向的是哪个函数,那个感觉真的很糟糕。(可以看后面的文章,要使用先进的程序框架,避免这样的情况)

时间: 2024-10-30 08:22:16

感触C语言中的面向对象思想的相关文章

做一个饲养员给动物喂食物的例子体现JAVA中的面向对象思想,接口(抽象类)的用处

做一个饲养员给动物喂食物的例子体现JAVA中的面向对象思想,接口(抽象类)的用处 interface Animal{             //动物的接口    public void eat(Food food); //接口中只有抽象的方法和静态常量!这里void前面省略了abstract.同样,变量可以省略static final} class Cat implements Animal //一种动物类:猫  {      public void eat(Food food) //这里是对

第三讲 Java语言中的面向对象特性

对象 [课前思考] 1. 什么是对象?什么是类?什么是包?什么是接口?什么是内部类? 2. 面向对象编程的特性有哪三个?它们各自又有哪些特性? 3. 你知道java语言在面向对象编程方面有何独特的特点吗? 难点: 1. 理解方法重载和方法重写,不要混淆了两者的使用. 2. 类变量和类方法的使用. 3. 接口的使用.3.1 面向对象技术基础 3.1.1 面向对象的基本概念 面向对象的基本思想 面向对象是一种新兴的程序设计方法,或者是一种新的程序设计规范(paradigm),其基本思想是使用对象.类

JavaScript中使用面向对象思想处理cookie

cookie|javascript|对象 1.创建Cookie对象 //因为是作为类名或者命名空间的使用,所以和Math对象类似,这里使用Cookie来表示该对象var Cookie = new Object();2.实现设置Cookie的方法 //name是要设置cookie的名称:value是设置cookie的值,option包括了其它选项,是一个对象作为参数Cookie.setCookie = function(name, value, option) {  //用于存储赋值给docume

如何理解并学习javascript中的面向对象(OOP)

本文不适合javascript初学者看(javascript水平还停留在函数级别的朋友,看了会觉得很晕的).如果你想让你的javascript代码变得更加优美,性能更加卓越.或者,你想像jQuery的作者一样,写出属于自己优秀的类库(哪怕是基于jquery的插件).那么,你请务必要学习javascript面向对象,否则你无法更灵活的使用javascript这门语言. 什么事闭包?到底什么是原型?(知道闭包和原型的,就算得上是javascript的高手了.但真正能够理解,并且灵活运用的人并不多)到

java语言学习002_面向对象编程思想

      人类在认识世界时,为了方便自己和智慧提升,很自然的对事物进行了分类.对世界进行了抽象,若把所有各个事物看做对象,纵观所有对象,这些对象具有各自的或共有的特征,并且又有共有的或各自的的能力,这样就可以对具有相同一些特征和一些能力的事物进行了归类.       比如,车,有汽车,火车他们都有哪些属性?                  汽车,特征:长度,颜色,速度,轮胎,载重,平面行走--能力:移动,载东西,--                  火车,特征:长度,颜色,速度,轮胎,载重

java编程思想-如何更好的理解java中的面向对象

问题描述 如何更好的理解java中的面向对象 现在学到java的面向对象,有时候会把很多知识点弄混乱,怎么样才能把面向对象的知识点梳理好啊 解决方案 万物皆对象!!!你可以这样理解,面向对象的思想主要是让我们程序员更好的理解编程,因为和机器交流语法比较难懂,所有为了让编程更简单人们就提出了面向对象的思想.就是我们将任何一个东西都可以想象成一个有血有肉的.比如一本书.我们可以知道书可以有书名,可以页数,可以有类容等等这就是我们所说的属性,书可能还有翻页等这些动作这就相当于方法(有些语言叫做函数)了

go语言学习与面向对象再思考

据说Smalltalk发明者Alan Kay就曾经说过: 我发明了面向对象,而我可以告诉你C++并不是我头脑里所想的东西. 面向对象的困惑 计算机里面只有数据和算法,数据用于对现实世界抽象建模,算法对数据演算,这已经很好,怎么出来一个面向对象这个"怪胎". 面向对象教学每次都要从对现实世界的模拟讲起,还记得那个会叫的鸭子的对象吗?面向对象认为对象有状态和行为,由此对现实世界抽象建模.然而现实世界就是面向对象的世界吗? 准确的说当时我所学的C++的面向对象对世界的模拟就是反世界反牛顿定理

深入理解Javascript中的面向对象

在学习Javascript的过程中,面向对象是必须要学会的课题.然而,网络上大部分文章只是简单地讲述如何通过代码实现面向对象,忽略了理论和原理方面的知识.本系列文章将从头开始逐步讲解面向对象编程思想及其在Javascript中的实现与应用. 从一个简单的需求开始 假设我们需要在程序中计算各种形状的周长,代码可能是这样的: var rectangle = {     name: '长方形1',     type: 'rectangle',     length: 5,  // 长     widt

php编程-php中的面向对象问题,求各路大神解答啊!

问题描述 php中的面向对象问题,求各路大神解答啊! php中的面向对象..类里边的成员属性到底是干嘛的?..类里边的方法最终只是为了给属性赋值吗????各路大神告诉我啊..求解答..感激不尽.. 解决方案 比如Person这个类,它有name,age,gendar等成员属性,它还有say()这个方法,方法就是它要执行的动作. <?php class Person { private $name; private $age; private $gendar; // 这里是一个构造方法,需要传入三