OOP by C language

这几天又仔细研究了下 C OOP ,有点新的结果,在这分享下,下面大概说下。

......................................................

Inherit(继承)  

实现继承机制很简单,结构体继承结构体,但是怎么去设计是另一个高度了,我这简单设计如下:

#define CB_CLASS_INHERIT_BEGIN(THIS, PARENT_CLASS)	\
struct THIS						\
{							\
	 PARENT_CLASS super;				\
	 
#define CB_CLASS_INHERIT_END()				\
};							\

#define CB_CLASS_POINTER_SET_PARENT(THIS, name, value)	\
	 ((THIS)->super)->name = value;

#define CB_CLASS_SET_PARENT(THIS, name, value)          \
	 ((THIS).super).name = value;

typedef struct _Base Base;
struct _Base {
	 int a;
};

typedef struct _Child Child;

CB_CLASS_INHERIT_BEGIN(_Child, Base) /**< _Child继承Base结构体 */
int b;
int c;
CB_CLASS_INHERIT_END()

int main(int argc, char *argv[])
{
	 Child m;
	 CB_CLASS_SET_PARENT(m, a, 5);
	 m.b = 3;
	 printf("Parent a=%d,Child b=%d\n",m.super.a, m.b);
	 return 0;
}

Template(模板)

/* --- Struct Template --- */
#define TplTest(T)								\
	 struct _test {								\
		  T a;									\
	 };											

/* --- Function Template --- */
#define TplTestFun(T)							\
	 T testFun() {								\
		  T a  = 0;								\
		  return a;								\
	 }

int main(int argc, char *argv[])
{
	 TplTest(char*);
	 struct _test obj;
	 obj.a="This is a String";

	 TplTestFun(int);
	 printf("%s,%d\n", obj.a, testFun());
	 
	 return 0;
}

Polymorphism(多态)
C多态机制主要是实现类似C++的虚函数表

#include <Akita/Akita.h>

typedef struct _Base Base;
typedef struct _BaseVt BaseVt;
typedef struct _Child Child;
typedef struct _ChildVt ChildVt;

#define GetVt(p,type) ((type*)(void*)p)->vt
#define BaseShow(p) GetVt(p,BaseVt).doSomething((Base*)p);
#define ChildShow(p) GetVt(p,ChildVt).doAnthing((Child*)p);
void displayBase();
void displayChild();
void justDoIt();

/* --- Base --- */
struct _Base {
	 void (*doSomething)(Base* p); /**< Function Pointer */
};

struct _BaseVt {
	 Base vt;
};

/* --- Child --- */
CB_CLASS_INHERIT_BEGIN(_Child, Base); /**< Inherit */
	void (*doAnthing)(Child* p);
CB_CLASS_INHERIT_END();

struct _ChildVt {
	 Child vt;
};

/* --- Base Init --- */
void InitBase(BaseVt **p) {
	 *p = (BaseVt*)malloc(sizeof(BaseVt));
	 (*p)->vt.doSomething = displayBase;
}
/* --- Child Init --- */
void InitChild(ChildVt **p) {
       *p = (ChildVt*)malloc(sizeof(ChildVt));
       (*p)->vt.super.doSomething = displayChild;
	   (*p)->vt.doAnthing = justDoIt;
}
void displayBase() {
	 printf("%s\n", "I'm Base");
}

void displayChild() {
	 printf("%s\n", "I'm Child");
}

void justDoIt() {
	 printf("%s\n", "I'm Child ,do anything");
}

int main(int argc, char *argv[])
{
	 BaseVt* p;
	 InitBase(&p);
	 BaseShow(p);

	 InitChild((Child **)&p);
	 BaseShow(p);
	 ChildShow(p);
	 
	 return 0;
}


如有疑问,请留言交流。





原文链接: http://blog.csdn.net/crazyjixiang/article/details/6734638

你可能感兴趣的:(OOP by C language)