相信很多人都看過設(shè)計(jì)模式方面的書,大家有什么體會呢?Bridge,Proxy,F(xiàn)actory這些設(shè)計(jì)模式都是基于抽象類的。使用抽象對象是這里的一個核心。
其實(shí)我覺得框架化編程的一個核心問題是抽象,用抽象的對象構(gòu)建程序的主體框架,這是面向?qū)ο缶幊痰钠毡樗枷?。用抽象?gòu)建骨架,再加上多態(tài)就形成了一個完整的程序。由于C++語言本身實(shí)現(xiàn)了繼承和多態(tài),使用這樣的編程理念(理念啥意思?跟個風(fēng),嘿嘿)在C++中是十分普遍的現(xiàn)象,可以說Virtual(多態(tài))是VC的靈魂。
但是,使用C語言的我們都快把這個多態(tài)忘光光了。我常聽見前輩說,類?多態(tài)?我們用的是C,把這些忘了吧。很不幸的是,我是一個固執(zhí)的人。這么好的東西,為啥不用呢。很高興的,在最近的一些純C代碼中,我看見了C中的多態(tài)!下面且聽我慢慢道來。
1. VC中的Interface是什么
Interface:中文解釋是接口,其實(shí)它表示的是一個純虛類。不過我所要說的是,在VC中的Interface其實(shí)就是struct,查找Interface的定義,你可以發(fā)現(xiàn)有這樣的宏定義:
#Ifndef Interface
#define Interface struct
#endif
而且,實(shí)際上在VC中,如果一個類有Virtual的函數(shù),則類里面會有vtable,它實(shí)際上是一個虛函數(shù)列表。實(shí)際上C++是從C發(fā)展而來的,它不過是在語言級別上支持了很多新功能,在C語言中,我們也可以使用這樣的功能,前提是我們不得不自己實(shí)現(xiàn)。
2.C中如何實(shí)現(xiàn)純虛類(我稱它為純虛結(jié)構(gòu))
比較前面,相信大家已經(jīng)豁然開朗了。使用struct組合函數(shù)指針就可以實(shí)現(xiàn)純虛類。
例子:
typedef struct {
void (*Foo1)();
char (*Foo2)();
char* (*Foo3)(char* st);
}
MyVirtualInterface;
這樣假設(shè)我們在主體框架中要使用橋模式。(我們的主類是DoMyAct,接口具體實(shí)現(xiàn)類是Act1,Act2)下面我將依次介紹這些“類”。(C中的“類”在前面有說明,這里換了一個,是使用早期的數(shù)組的辦法)
主類DoMyAct: 主類中含有MyVirtualInterface* m_pInterface; 主類有下函數(shù):
DoMyAct_SetInterface(MyVirtualInterface* pInterface)
{
m_pInterface= pInterface;
}
DoMyAct_Do()
{
if(m_pInterface==NULL) return;
m_pInterface->Foo1();
c=m_pInterface->Foo2();
}
子類Act1:實(shí)現(xiàn)虛結(jié)構(gòu),含有MyVirtualInterface st[MAX]; 有以下函數(shù):
MyVirtualInterface* Act1_CreatInterface()
{
index=FindValid() //對象池或者使用Malloc !應(yīng)該留在外面申請,實(shí)例化
if(index==-1) return NULL;
St[index].Foo1=Act1_Foo1; // Act1_Foo1要在下面具體實(shí)現(xiàn)
St[index].Foo2=Act1_Foo2;
St[index].Foo3=Act1_Foo3;
Return &st [index];
}
子類Act2同上。
在main中,假設(shè)有一個對象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
其實(shí)我覺得框架化編程的一個核心問題是抽象,用抽象的對象構(gòu)建程序的主體框架,這是面向?qū)ο缶幊痰钠毡樗枷?。用抽象?gòu)建骨架,再加上多態(tài)就形成了一個完整的程序。由于C++語言本身實(shí)現(xiàn)了繼承和多態(tài),使用這樣的編程理念(理念啥意思?跟個風(fēng),嘿嘿)在C++中是十分普遍的現(xiàn)象,可以說Virtual(多態(tài))是VC的靈魂。
但是,使用C語言的我們都快把這個多態(tài)忘光光了。我常聽見前輩說,類?多態(tài)?我們用的是C,把這些忘了吧。很不幸的是,我是一個固執(zhí)的人。這么好的東西,為啥不用呢。很高興的,在最近的一些純C代碼中,我看見了C中的多態(tài)!下面且聽我慢慢道來。
1. VC中的Interface是什么
Interface:中文解釋是接口,其實(shí)它表示的是一個純虛類。不過我所要說的是,在VC中的Interface其實(shí)就是struct,查找Interface的定義,你可以發(fā)現(xiàn)有這樣的宏定義:
#Ifndef Interface
#define Interface struct
#endif
而且,實(shí)際上在VC中,如果一個類有Virtual的函數(shù),則類里面會有vtable,它實(shí)際上是一個虛函數(shù)列表。實(shí)際上C++是從C發(fā)展而來的,它不過是在語言級別上支持了很多新功能,在C語言中,我們也可以使用這樣的功能,前提是我們不得不自己實(shí)現(xiàn)。
2.C中如何實(shí)現(xiàn)純虛類(我稱它為純虛結(jié)構(gòu))
比較前面,相信大家已經(jīng)豁然開朗了。使用struct組合函數(shù)指針就可以實(shí)現(xiàn)純虛類。
例子:
typedef struct {
void (*Foo1)();
char (*Foo2)();
char* (*Foo3)(char* st);
}
MyVirtualInterface;
這樣假設(shè)我們在主體框架中要使用橋模式。(我們的主類是DoMyAct,接口具體實(shí)現(xiàn)類是Act1,Act2)下面我將依次介紹這些“類”。(C中的“類”在前面有說明,這里換了一個,是使用早期的數(shù)組的辦法)
主類DoMyAct: 主類中含有MyVirtualInterface* m_pInterface; 主類有下函數(shù):
DoMyAct_SetInterface(MyVirtualInterface* pInterface)
{
m_pInterface= pInterface;
}
DoMyAct_Do()
{
if(m_pInterface==NULL) return;
m_pInterface->Foo1();
c=m_pInterface->Foo2();
}
子類Act1:實(shí)現(xiàn)虛結(jié)構(gòu),含有MyVirtualInterface st[MAX]; 有以下函數(shù):
MyVirtualInterface* Act1_CreatInterface()
{
index=FindValid() //對象池或者使用Malloc !應(yīng)該留在外面申請,實(shí)例化
if(index==-1) return NULL;
St[index].Foo1=Act1_Foo1; // Act1_Foo1要在下面具體實(shí)現(xiàn)
St[index].Foo2=Act1_Foo2;
St[index].Foo3=Act1_Foo3;
Return &st [index];
}
子類Act2同上。
在main中,假設(shè)有一個對象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