C语言面向对象的编程范式

上一篇文章提到的Lua的对象系统,是C语言实现面向对象的一个典范。但对于大部分工程项目来说,没有必要实现的那么复杂。这里介绍我采用的一个方案。

首先,可以设计一个结构体,用于整个模块的管理,结构体可以直接命名为模块名,该结构体最好定义在.c文件中。

一个功能模块内,可能需要有多个类引出,类的定义最好都放在.c文件中,以做到内部逻辑的隐藏。

//管理整个模块
struct  module{
      ....
};

//模块内的类
struct subset{
  ....
};

整个模块需要加载到项目中,所以需要实现一个初始化函数,模块的卸载不是必须的(按经验,应该是没有必要的)。

需要提供各个类的构造、析构,调试接口,以及get,set方法。

需要声明一下需要导出的类,因为只是声明没有定义,外部调用只能持有类的指针,不能访问类的成员,这做到了面向对象的封装性。

struct subset;

int module_init();

//构造
struct subset *subset_create();
//析构
void subset_release(struct subset *);
//调试
void subset_debug(); 
//get set 方法
int subset_get_id(struct subset *);
int subset_set_id(struct subset *,);

一般情况下,模块还有一些逻辑要实现,模块的逻辑实现,我们围绕着模块管理这个结构体来做。

struct moudle{
     list *subset;  //组织模块内需要管理的类
    ...
};

struct module *M = NULL;

//单例实现
int moudle_init(){
  if(M == NULL){
        M = malloc(sizeof(*M));
        .....
  }
}
//模块内逻辑,返回值为错误码,一般0代表成功,-1代表失败
int module_xx_xx(struct subset*,... );//第一个xx是动词,第二个xx是名词

如果模块比较复杂,可以增加一个错误提示单元(往往并不需要)

enum{
  MODULE_OK,
  MODULE_ERROR,
  MODULE_FAIL
};

static const char* ErrorMsg[] = {
  "module_ok",
  "module_error",
  "module_fail",
};

const char *module_error(int errcode){ 
  return ErrMsg(errcode);
}

以上。

你可能感兴趣的:(C语言面向对象的编程范式)