C语言的多态实现
相信许多人都看过设计模式方面的书,各人有什么体会呢?Bridge,Proxy,Factory这些设计模式都是基于抽象类的。利用抽象工具是这里的一个焦点。
其实我以为框架化编程的一个焦点问题是抽象,用抽象的工具构建措施的主体框架,这是面向工具编程的普遍思想。用抽象构建骨架,再加上多态就形成了一个完整的措施。由于C++语言自己实现了担任和多态,利用这样的编程理念(理念啥意思?跟个风,嘿嘿)在C++中是十分普遍的现象,可以说Virtual(多态)是VC的魂灵。
可是,利用C语言的我们都快把这个多态忘光光了。我常听见前辈说,类?多态?我们用的是C,把这些忘了吧。很不幸的是,我是一个顽强的人。这么好的对象,为啥不消呢。很兴奋的,在最近的一些纯C代码中,我瞥见了C中的多态!下面且听我逐步道来。
1. VC中的Interface是什么
Interface:中文表明是接口,其实它暗示的是一个纯虚类。不外我所要说的是,在VC中的Interface其实就是suct,查找Interface的界说,你可以发明有这样的宏界说:
#Ifndef Interface
#define Interface suct
#endif
并且,实际上在VC中,假如一个类有Virtual的函数,则类内里会有v,它实际上是一个虚函数列表。实际上C++是从C成长而来的,它不外是在语言级别上支持了许多新成果,在C语言中,我们也可以利用这样的成果,前提是我们不得不本身实现。
2.C中如何实现纯虚类(我称它为纯虚布局)
较量前面,相信各人已经豁然开朗了。利用suct组合函数指针就可以实现纯虚类。
例子:
typedef suct {
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