前言:
由于俺迫于可移植性,还有嵌入式的各种限制。只好使用C语言来实现C++中的面向对象编程方法。
有些时候不用OO还不行,互相关联的对象关系说不清,命名空间污染得得厉害。
但是C语言原生不支持class,继承,虚函数等的语法。参考了一些网上用C写OO的模板与教材,感觉太依赖于宏定义跟预处理了。继承起来很不好理解。
最后看了云风兄的博文,深有启发。
俺给自己定了个原则:1.能不用宏的地方不用宏,能不用指针就不用指针,能不用C语言偏僻技巧就不用。程序不是光自己看的,还要给维护代码的人看。2.有选择性的使用OO,尽量不用继承Inheritance而用构造Composition,主要使用面向接口来实现OO。
一、 一个简单类的封装
如果现在有一个接口Iface. 对应着一个数据类型(结构体)。
struct Dface; struct Iface{ void(*init)(struct Dface* data); void(*dosomething)(struct Dface* data); };
如果有一个类Class需要实现接口Iface:
struct Class{ struct Iface* i_face; //这里使用指针是因为每个类对应的接口只需要一份拷贝就足够了 struct Dface d_face; // 这里不使用指针 };
为Class创建一个接口实例:
struct Iface i_face_for_Class = { face_init_for_Class, face_dosomething_for_Class, };
为Class写一个初始化函数:
Class_init(struct Class* c) { c->i_face = &i_face_for_Class; //注意!! 初始化对象的接口指针! c->i_face->init(&c->d_face); //调用接口i_face函数 }
实例化Class的一个对象:
struct Class Object; Class_init(&Object);
调用一个函数试试 :) ~~
Object.i_face->dosomething(&Object.d_face);
小结:
代码还算清爽,就是调用函数比较罗嗦。其实是可以用:1.宏来简化代码,但是坚决能不用就不用了。2.在Object当中保存一个名叫this的指针!指向Object本身。还是算了,整那么多指针违反原则。
参考:
1.博客文章:《我所偏爱的 C 语言面向对象编程范式》 云风的BLOG
2.程序代码:《LW_OOPC》 http://sourceforge.net/projects/lwoopc/
3.图书:《Object-oriented Programming with ANSI-C》
4.图书:《Python源码剖析》