C语言中的面向对象(2)-C语言的多态实现
相信很多人都看过设计模式方面的书。你有什么经验?桥、代理和工厂设计模式都基于抽象类。使用抽象对象是这里的一个核心。
其实我觉得框架编程的核心问题之一就是抽象,抽象是面向对象编程的一般思想。一个完整的程序是通过构建一个具有抽象性和多态性的骨架而形成的。因为c++语言本身实现了继承和多态,用这样的编程概念(概念是什么意思?跟风,呵呵)是C++中非常普遍的现象,可以说虚(多态)是VC的灵魂。
然而,我们这些使用C语言的人几乎已经把这种多态性忘得一干二净了。经常听前辈说,课?多态性?我们用C,算了吧。可惜我是个固执的人。这么好的东西为什么不用?很开心,在最近的一些纯C代码中,我看到了C中的多态性!现在慢慢听我说。
1。VC中的接口是什么?
接口:中文解释是接口,但实际上代表的是纯虚类。但是,我想说的是,VC中的Interface其实是struct。如果你查一下接口的定义,你可以找到这样一个宏定义:
#Ifndef接口
#定义接口结构
#endif
而且,其实在VC中,如果一个类有虚函数,那么类中就会有vtable,其实就是一个虚函数列表。其实c++是由C发展而来的,它只支持语言层面的很多新功能。在C语言中,我们也可以使用这样的函数,前提是我们必须自己实现。
如何在2.C中实现纯虚类(我称之为纯虚结构)。
对比前面,相信大家都豁然开朗了。纯虚类可以用struct组合函数指针实现。
示例:
typedef struct {
void(* foo 1)();
char(* foo 2)();
char *(* foo 3)(char * ST);
}
my virtual interface;
这假设我们将在主框架中使用桥模式。(我们的主类是DoMyAct,接口实现类是Act1和Act2。)我将依次介绍这些“类”。(C中的“类”前面已经解释过了,这里还有一个,是更早数组的使用方式)
Main class DoMyAct:Main类包含myvirtualinterface * m _ p接口;主类具有以下功能:
DOM yact _ set interface(my virtual interface * Pinter face)
{
m _ Pinter face = Pinter face;
}
domy act _ Do()
{
if(m _ Pinter face = = NULL)return;
m _ p interface-> foo 1();
c = m _ Pinter face-> foo 2();
}
子类Act1:实现虚拟结构,包含my virtual interface ST[MAX];有以下功能:
my virtual interface * act1 _ create interface()
{
index = find valid()//对象池或使用Malloc!应该留在外面应用,实例化
if(index==-1)返回NULL
St[index]. foo 1 = act 1 _ foo 1;// Act1_Foo1应该在
St[index].Foo2=Act1_Foo2以下具体实现;
St[index]. foo 3 = act 1 _ foo 3;
Return & ST[index];
}
子类型Act2同上。
在main中,假设有一个对象列表。MyVirtualInterface指针存储在列表中,有:
if((p = Act1 _ creation interface())!= NULL)
List _ add object(& List,p);//Add All
While(p = List _ GetObject()){
domy act _ set interface(p);//接口代替原来的大长度Switch Case
DOM yact _ Do();//不用关注具体的动作,直接去做
}
FREE ALL
0条评论