最理想的面向对象语法当然是仿造C#、java这样的结构了,但是因为C语言要用头文件,所以估计最终的样式还是类似于C++。首先我们还是制定一个目标的样式,然后再去用Crest仿造实现。目标是这样的[代码1]:
class CString: CObject, IUnknown, IDispatch
{
int length;
char * buffer;
public virtual void Format(char * format)
{
DoFormat(format);
}
public void DoFormat(char * format)
{
if( OnFormat != null ) OnFormat(format);
}
public abstract void OnFormat(char * format);
}
要想用Crest实现上面的结构,有几个问题要注意:
this指针。所有的对象成员定义和调用都隐含有一个this指针
命名规范,CString的Format和CDateTime的Format肯定不是同一个东西,但是C语言不支持override,所以要保证成员函数不重名。
经过两天的断断续续工作,最终呈现结果如下[代码2]:
DECLARE_CLASS(CString)
EXTENDS(CObject, IMPLEMENT2(IUnknown,IDispatch))
DECLARE_FIELD(CString, int, length)
DECLARE_FIELD(CString, char *, buffer)
DECLARE_VIRTUAL1(CString, void, Format, const char * format)
DECLARE_ABSTRACT1(CString, void, OnFormat,const char * format)
DECLARE_METHOD1(CString, void, DoFormat,const char * format)
DECLARE_CONSTRUCTOR(CString)
DECLARE_DESTRUCTOR(CString)
END_DECLARE(CString);