从学习编程开始就一直被灌输面向对象,继承,多态等等思想,工作后遇到一些纯C的编程工作还是有些不习惯,毕竟用C实现库以及中间件给别人使用也还是不如C++方便直观。
这几天偶然看到一个轻量级的面向对象的C编程框架LW_OOPC,作者通过宏定义封装了面向对象编程的一些工具,我们可以用来方便的指定类,继承,借口等。
首先下载框架包含到我们的项目中来(lw_oopc.h以及lw_oopc.c两个文件),我下面首先定义一个抽象类People,和一个Friend类,以及一个接口放在friend.h头文件中
#ifndef __FRIEND_H #define __FRIEND_H /* * friend.h */ #include "lw_oopc.h" INTERFACE(ICall) { void (*call)(ICall *ic); }; ABS_CLASS(People) { char name[100]; int age; void (*say)(People* p,const char *word); void (*init)(People* p,const char* name,int age); }; CLASS(Friend) { EXTENDS(People); IMPLEMENTS(ICall); int tel; void (*init)(Friend* f,const char* name,int age,int tel); }; #endif
/* * friend.c */ #include "friend.h" void People_Say(People* p,const char* word) { printf("%s¥n",word); } void People_Init(People* p,const char* name,int age) { strcpy(p->name,name); p->age = age; } ABS_CTOR(People) FUNCTION_SETTING(say,People_Say); FUNCTION_SETTING(init,People_Init); END_ABS_CTOR void Friend_Init(Friend* f,const char *name,int age,int tel) { People *p = SUPER_PTR(f,People); People_Init(p,name,age); f->tel = tel; } void Friend_Call(Friend* f) { printf("Hello Friend"); } CTOR(Friend) SUPER_CTOR(People); FUNCTION_SETTING(init,Friend_Init); FUNCTION_SETTING(ICall.call,Friend_Call); END_CTOR
#include <stdio.h> #include "lw_oopc.h" #include "friend.h" int main (int argc, const char * argv[]) { // insert code here... Friend* f = Friend_new(); f->init(f,"penjin",25,1590000000); People* p = SUPER_PTR(f,People); printf("Friend'name is %s and age is %d and tel number is %d¥n",p->name,p->age,f->tel); ICall* ic = SUPER_PTR(f,ICall); ic->call(f); lw_oopc_delete(f); lw_oopc_report(); return 0; }输出结果Friend'name is penjin and age is 25 and tel number is 1590000000 ¥n Hello Friend
使用起来还算比较方便简单的,将来如果遇到想实现C的面向对象编程,这个框架是个不错的选择,呵呵