|
发表于 2004-12-25 09:59:28
|
显示全部楼层
我对面向对象的理解很简单:整个世界由物体(对象,Objects)组成,物体是怎么构成的?其实就是物体内部的数据结构和操作物体的方法(Method)。面向对象程序设计最重要的就是隐藏物体内部的数据结构,其他物体只能通过指定(well defined)的方法来操作这个物体。
只要明白了这个,你就会发现用C来实现面向对象程序设计的例子比比皆是。例如文件指针和文件描述符,你根本不知道文件对象的内部结构,只能通过open, read, close, fopen, fread, fclose去操作文件。编过Xlib和Win32 SDK程序的都知道窗口(Window)对象的内部结构是包装起来的,只能通过指定的函数来操作这些窗口对象。
至于抽象类,继承,多态这些东西,都是把面向对象概念再拔高而产生的东东,其核心的东西还是离不开对象和操作对象的方法。Linux内核的VFS的实现体现了这些继承,多态这些概念,核心的东西其实还是对象和操作对象的方法。
所以实现面向对象程序设计并不在乎你用什么语言,汇编语言一样可以实现。只是C++,Java可能让你写起面向对象程序程序来更方便一些而已。就我的经验而言,我倒是更喜欢用C来写面向对象程序,因为信息隐藏更彻底。例如下面的例子,internal.h定义了一个对象内部实现的细节和操作方法,这个header文件是要使用这个对象编成的外部程序员所看不见的,外部程序员看到的只是external.h。如果用C++,internal.h往往和external.h就是一样的,但是mystruct里的a, b, c都会被定义为private变量,以使外部程序员不能直接访问到它们。但是mystruct的结构外部程序员还是知道的。外部程序员其实可以使用offsetof宏来访问这些private变量,绕过C++编译器所设置的限制。
internal.h
typedef struct {
int a, b, c;
...
} mystruct;
mystruct* alloc_myobj ();
int op_myobj (mystruct*);
void free_myobj (mystruct*);
external.h
typedef void* objid;
objid alloc_myobj ();
int op_myobj (objid);
void free_myobj (objid); |
|