从读《面向对象设计导论》(C.Thomas Wu )时,它就告诉我,面向对象是以数据为中心的。可惜我对真正的使用class来做程序每什么经验,我所能接触到的,还没有复杂到,或者说,面向过程已经很好的解决了这个问题。
最近又拿回来c,看到了一篇关于c中变参数的文章,和csdn文档首页上放置了很久的c中的面向对象。
看了。http://dev.csdn.net/article/29/29250.shtm 可惜csdn上的那篇文章好像只是“形似”,在使用struct和一些些指针后做了两个类出来。又继承又多态。我的道行还不够高,只是在读c算法时,在一级ADT中,我却嗅到了OO的气息。ADT就是抽象数据类型的缩写(abstract data type)。说白了和数据结构是一家子。在良好的封装了数据以后,通过接口来实现数据和算法的分离,这不就已经很OO了么?
很长时间里,人们在说类和结构没有区别,除了结构不能初始化以外。
我不知道在做了良好了ADT后,怎么来实现它的面向对象特性,我想已经不远了,让我再往里走走看.
下面的是一个复数的结构:
-----
typedef struct { float Re; float Im; } Complex; //复数ADT
Complex COMPLEXinit(float, float);
float Re(Complex);
float Im(Complex);
Complex COMPLEXmult(Complex, Complex);
-----
#include "COMPLEX.h" //接口实现
Complex COMPLEXinit(float Re, float Im)
{ Complex t; t.Re = Re; t.Im = Im; return t; }
float Re(Complex z)
{ return z.Re; }
float Im(Complex z)
{ return z.Im; }
Complex COMPLEXmult(Complex a, Complex b)
{ Complex t;
t.Re = a.Re*b.Re - a.Im*b.Im;
t.Im = a.Re*b.Im + a.Im*b.Re;
return t;
}
-----
typedef struct complex *Complex; //复数ADT句柄
Complex COMPLEXinit(float, float);
float Re(Complex);
float Im(Complex);
Complex COMPLEXmult(Complex, Complex);
----- //实现
#include < stdlib.h >
#include "COMPLEX.h"
struct complex { float Re; float Im; };
Complex COMPLEXinit(float Re, float Im)
{ Complex t = malloc(sizeof *t);
t->Re = Re; t->Im = Im;
return t;
}
float Re(Complex z)
{ return z->Re; }
float Im(Complex z)
{ return z->Im; }
Complex COMPLEXmult(Complex a, Complex b)
{
return COMPLEXinit(Re(a)*Re(b) - Im(a)*Im(b),
Re(a)*Im(b) + Im(a)*Re(b));
}