首页 | 互联网 | IT动态 | 网络设备 | 服务器 | IDC | 安全 | Cisco | Windows | Linux | Java | .Net | Oracle | CIW | 华为 | 专题
IT技术 | 网页设计 | 平面设计 | 电子书下载 | 教学视频 | 方案 | 数字网校 | 直播室 | 虚拟考场 | 面授培训 | 搜索 | 博客 | 沙龙 | 论坛
首页 | JAVA | C# | VB | VB.NET | C/C++ | delphi | 工程管理 | 其他语言 | 论坛
免费注册一站通帐号,参与直播、论坛、下载、博客、网摘、评论,展现我的风采!
您现在的位置: 中国IT实验室 >> 桌面开发 >> VC >> 文章正文
OO in C(2):C语言的多态实现方法
来源:中国IT实验室整理  时间:2007-4-4

  相信很多人都看过设计模式方面的书,大家有什么体会呢?Bridge,Proxy,Factory这些设计模式都是基于抽象类的。使用抽象对象是这里的一个核心。
 
  其实我觉得框架化编程的一个核心问题是抽象,用抽象的对象构建程序的主体框架,这是面向对象编程的普遍思想。用抽象构建骨架,再加上多态就形成了一个完整的程序。由于C++语言本身实现了继承和多态,使用这样的编程理念(理念啥意思?跟个风,嘿嘿)在C++中是十分普遍的现象,可以说Virtual(多态)是VC的灵魂。
 
  但是,使用C语言的我们都快把这个多态忘光光了。我常听见前辈说,类?多态?我们用的是C,把这些忘了吧。很不幸的是,我是一个固执的人。这么好的东西,为啥不用呢。很高兴的,在最近的一些纯C代码中,我看见了C中的多态!下面且听我慢慢道来。
 
  1.VC中的Interface是什么Interface:中文解释是接口,其实它表示的是一个纯虚类。不过我所要说的是,在VC中的Interface其实就是struct,查找Interface的定义,你可以发现有这样的宏定义:#Ifndef Interface #define Interface struct #endif而且,实际上在VC中,如果一个类有Virtual的函数,则类里面会有vtable,它实际上是一个虚函数列表。实际上C++是从C发展而来的,它不过是在语言级别上支持了很多新功能,在C语言中,我们也可以使用这样的功能,前提是我们不得不自己实现。
 
  2.C中如何实现纯虚类(我称它为纯虚结构)
 
  比较前面,相信大家已经豁然开朗了。使用struct组合函数指针就可以实现纯虚类。
 
  例子: typedef struct { void (*Foo1)();char (*Foo2)();char* (*Foo3)(char* st);}MyVirtualInterface;这样假设我们在主体框架中要使用桥模式。(我们的主类是DoMyAct,接口具体实现类是Act1,Act2)下面我将依次介绍这些“类”。(C中的“类”在前面有说明,这里换了一个,是使用早期的数组的办法)
 
  主类DoMyAct: 主类中含有MyVirtualInterface* m_pInterface; 主类有下函数:DoMyAct_SetInterface(MyVirtualInterface* pInterface)
 
  { m_pInterface= pInterface;} DoMyAct_Do()
 
  { if(m_pInterface==NULL) return;m_pInterface->Foo1();c=m_pInterface->Foo2();}子类Act1:实现虚结构,含有MyVirtualInterface st[MAX]; 有以下函数:MyVirtualInterface* Act1_CreatInterface()
 
  { index=FindValid() //对象池或者使用Malloc !应该留在外面申请,实例化if(index==-1) return NULL;St[index].Foo1=Act1_Foo1; // Act1_Foo1要在下面具体实现St[index].Foo2=Act1_Foo2;St[index].Foo3=Act1_Foo3;Return &st [index];}子类Act2同上。
 
  在main中,假设有一个对象List.List中存贮的是MyVirtualInterface指针,则有:if( (p= Act1_CreatInterface()) != NULL)
 
  List_AddObject(&List, p); //Add All While(p=List_GetObject()){ DoMyAct_SetInterface(p);//使用Interface代替了原来大篇幅的Switch Case DoMyAct_Do();//不要理会具体的什么样的动作,just do it } FREE ALL.在微系统里面,比如嵌入式,通常使用对象池的技术,这个时候可以不用考虑释放的问题(对象池预先没有空间,使用Attach,在某个函数中申请一个数组并临时为对象池分配空间,这样函数结束,对象池就释放了)
 
  但是在Pc环境下,由于程序规模比较大,更重要的是一些特殊的要求,使得对象的生命周期必须延续到申请的那个函数体以外,就不得不使用malloc,实际上即使在C++中,new对象的自动释放始终是一个令人头疼的问题,新的标准引入了智能指针。但是就我个人而言,我觉得将内存释放的问题完全的交给机器是不可信任的,它只能达到准最佳。
 
  你知道设计Java的垃圾回收算法有多困难吗?现实世界是错综复杂的,在没有先验条件下,要想得到精确的结果及其困难。所以我说程序员要时刻将free记在心上,有关程序的健壮性和自我防御将在另外一篇文章中讲述。
 
  3.纯虚结构的退化下面我们来看看如果struct里面仅仅有一个函数是什么? 这个时候如果我们不使用struct,仅仅使用函数指针又是什么? 我们发现,这样就退化为普通的函数指针的使用了。
 
  所以说,有的时候我觉得面向对象仅仅是一种形式,而不是一种技术。是一种观点,而不是一种算法。但是,正如炭,石墨和钻石的关系一样,虽然分子式都是C,但是组成方法不一样,表现就完全不一样了!
 
  有的时候,我们经常被编程中琐碎的事情所烦恼,而偏离了重心,其实程序可进化的特性是很重要的。有可能,第一次是不成功的,但是只要可进化,就可以发展。
 
  4.进阶――类结构树,父类不是纯虚类的类前面仅仅讲的是父类是纯虚结构的情况 (面向对象建议的是所有类的基类都是从纯虚类开始的), 那么当类层次比较多的情况下,出现父类不是纯虚结构怎么办呢。嘿嘿,其实在C中的实现比C++要简单多了。因为C中各个函数是分散的。
 
  在这里使用宏定义是一个很好的办法:比如两个类Act1,ActByOther1“继承”Act1:MyVirtualInterface* ActByOther1_CreatInterface()
 
  { index=FindValid() //对象池或者使用Malloc if(index==-1) return NULL;St[index].Foo1= ActByOther1_Foo1; // Act1_Foo1要在下面具体实现St[index].Foo2= ActByOther1_Foo2;St[index].Foo3= ActByOther1_Foo3;Return &st [index];}#define ActByOther1_Foo1 Act1_Foo1 //这就是继承 嘿嘿ActByOther1_Foo2(){}          // 可以修改其实现ActByOther1_DoByOther() {}     //当然就可以添加新的实现咯5.实例――可以参见H264的源码,其中NalTool就是这样的一个纯虚结构。
 
【责编:landss】

中国IT教育热线咨询

相关文章
C语言中的位域的使用
OO in C(1):C语言中的类模拟和多态,继…
OO in C(4):C语言中的面向对象思想
推荐文章
· 用C#创建COM对象
· IT管理十大失误及其对策
· VC中利用MFC设计绘图程序初步
· JAVA中对象创建和初始化过程
· C语言中的位域的使用
· 浅谈Java桌面应用程序开发
· C#的前途如何?
· 几种VC++数据库开发技术的相对比较
 精彩友情推荐
·锐捷交换机报价
·锐捷交换机
·锐捷网络网络交换机
·smc交换机
·smc交换机报价
·IDC资讯大全
·机房品质万里行
·IDC托管必备知识
·全国IDC报价
·网站推广优化
最新更新 推荐文章
·Visual Basic 9.0隐式类型的局部…09-30
·JMX+J2SE5.0实现Web应用的安全管…09-30
·多线程、Socket技术及委托技术的…09-21
·Visual C#多线程参数传递浅析09-21
·浅谈Java中利用JCOM实现仿Excel编…09-21
·基于Java的界面布局DSL的设计与实…09-21
·Java开发中的事件驱动模型实例详…09-21
·并发工程原则应用到软件项目中09-06
·Delphi初学者应小心的六大陷阱09-06
·VC开发多语言界面支持的简单方法09-06
·用C#创建COM对象09-06
·用C#创建COM对象09-06
·IT管理十大失误及其对策08-30
·VC中利用MFC设计绘图程序初步08-23
·JAVA中对象创建和初始化过程08-23
·C语言中的位域的使用08-09
·浅谈Java桌面应用程序开发08-09
·C#的前途如何?08-02
·几种VC++数据库开发技术的相对比较07-12
·用Visual C#实现网络封包监视07-12
·VB.NET中的TextBox控件详解07-12
·VB.NET实现PC与掌上电脑PPC的双向通信07-05
  培训中心