嵌入式linux C编程 -
2008-02-23 05:32:12来源:互联网 阅读 ()
sunliantao | 2006-10-01 10:47 |
: 相信很多人都看过设计模式方面的书,大家有什么体会呢?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]; } 标签: 版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 上一篇: 编程语言 下一篇: 嵌入式系统C语言讲座
相关文章
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设 网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源 网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它 服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护 软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷 网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash 热门词条
最新资讯
热门关注
热门标签
|