C语言中的面向对象(4)-面向对象思想

2016-02-19 19:12 6 1 收藏

最近很多朋友喜欢上设计,但是大家却不知道如何去做,别担心有图老师给你解答,史上最全最棒的详细解说让你一看就懂。

【 tulaoshi.com - 编程语言 】

经常听见别人说面向对象的程序设计,以前在学校上课的时候,也有开面向对象程序设计这门课。可是不幸的是,这些都是以C++,甚至VC++为基础的。而更加不幸的是,多年以来我一直是一个C的使用者。在学校的时候,我主要做的是硬件上的驱动层,和底层功能层。 !-- frame contents -- !-- /frame contents -- 在工作以后,又做的是手机上的软件开发,所有这些都是和C离不开的。虽然我不得不说,C++是一门很好的语言,但是它的编译速度,代码效率,编译后的代码大小都限制了它在嵌入式上的应用。(但现在的嵌入式CPU越来越快,内存容量变大。我觉得用C++也应该没有什么问题。这使我觉得似乎是嵌入式编译器的限制。虽然菲利普和TI似乎都有C++的编译器,但是似乎没人用这个。难道是太贵了? 但不管怎么说,嵌入式应用中,C语言的普遍使用是肯定的)  那么在面向过程的时代产生的C语言能否使用面向对象的思想呢?我认为是肯定可以的,C++不过是在语言级别上加入了对对象的支持,同时提供了丰富的对象库。而在C语言下,我们只好自力更生了。  一、 面向对象思想的目的是框架化,手段是抽象  相信很多人都明白面向对象讲了什么:类,抽象类,继续,多态。但是是什么原因促使这些概念的产生呢?  打个比方说:你去买显示器,然而显示器的品牌样式是多种多样的,你在买的过程中发生的事情也是不可猜测的。对于这样的事情,我们在程序语言中如何去描述呢。面向对象的思想就是为了解决这样的问题。编写一个程序(甚至说是一个工程),从无到用是困难的,从有到丰富是更加困难的。面向对象将程序的各个行为化为对象,而又用抽象的办法将这些对象归类(抽象),从而将错综复杂的事情简化为几个主要的有机组合(框架化)。  其实我们的身边很多东西都是这样组成的:比如说电脑:电脑是由主板,CPU加上各种卡组成的。这就是一个框架化。而忽略不同的CPU,不同的主板,不同的声卡,网卡,显卡的区别,这就是抽象。再比如说现在的教育网:是由主核心节点:清华,北大,北邮等几个,然后是各个子节点,依次组成了整个教育网网络。  所以我觉得面向对象的编程思想就是:一个大型工程是分层次结构的,每层又由抽象的结构连接为整体(框架化),各个抽象结构之间是彼此独立的,可以独立进化(继续,多态)。层次之间,结构之间各有统一的通讯方式(通常是消息,事件机制)。 更多内容请看C/C++进阶技术文档专题,或   二、以前C语言编程中常用的“面向对象”方法  其实C语言诞生以来,人们就想了很多办法来体现“面向对象”的思想。下面就来说说我所知道的方法。先说一些大家熟悉的东东,慢慢再讲诡异的。呵呵 !-- frame contents -- !-- /frame contents --   1.  宏定义:
  
  有的人不禁要问,宏定义怎么扯到这里来了,我们可以先看一个简单的例子:
  
  #define MacroFunction  Afunction
  
  然后在程序里面你调用了大量的AFunction,但是有一天,你忽然发现你要用BFunction了,(不过AFunction又不能不要,很有可能你以后还要调用),这个时候,你就可以#define MacroFunction  Bfunction来达到这样的目的。
  
  当然,不得不说这样的办法是too simple,sometime naïve的,因为一个很滑稽的问题是假如我一般要改为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仅仅实现名字解析的功能)――!接口限制和名字解析  接口限制:层与层之间仅仅知道有限的函数  名字解析:层与层之间建立共同的名字与函数的对应关系,之间利用名字调用功能。 更多内容请看C/C++进阶技术文档专题,或

来源:http://www.tulaoshi.com/n/20160219/1620311.html

延伸阅读
标签: Web开发
一。传统的基于原型(Prototype)的做法 确切地说Javascrīpt的“类”在严格意义上来讲并不能算真正的类,从其声明的对象到类(估切这么说)有这样一个关系: Instance.__proto__=InstanceClass.prototype(ie不支持) 以上说明:实例的属性(__proto__)等于类的prototpye,我们可以看出,实例的"__proto__"正好巧接在类的"prototype"上,通过原型链...
我是从学习Java编程开始接触OOP(面向对象编程),刚开始使用Java编写程序的时候感觉很别扭,因为我早以习惯用C来编写程序,很欣赏C的简洁性和高效性,喜欢C简练而表达能力丰富的风格,特别忍受不了Java运行起来慢吞吞的速度,相对冗长的代码,而且一个很简单的事情,要写好多类,一个类调用一个类,心里的抵触情绪很强。 我对Java的面...
标签: Web开发
面向对象编程的概念: 不同的作者之间说法可能不一样,但是一个OOP语言必须有以下几方面: 抽象数据类型和信息封装  继承  多态  在PHP中是通过类来完成封装的:  ?php  class Something {  // 在OOP类中,通常第一个字符为大写  var $x;  function s...
标签: Web开发
上一篇写的废话太多,写得很烂,这一次讲讲继承吧,我们上一节知道了prototype,现在我从prototype下手来实现方法 scrīpt LANGUAGE="Javascrīpt" !-- function 职业(){  var 须知="每天要好好上班"; } 职业.prototype.上班=function(name){  return name+"上班"; } 职业.prototype.下班=function(){ ...
    我是从学习Java编程开始接触OOP(面向对象编程),刚开始使用Java编写程序的时候感觉很别扭,因为我早以习惯用C来编写程序,很欣赏C的简洁性和高效性,喜欢C简练而表达能力丰富的风格,非凡忍受不了Java运行起来慢吞吞的速度,相对冗长的代码,而且一个很简单的事情,要写好多类,一个类调用一个类,心里的抵触情绪很强。...

经验教程

753

收藏

22
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部