有了那些const.h的定义后,我们就可以开工了。
首先我们先定义一个元素类Class Element,这个类是下面我们实现线性表List、栈Stack等等基础数据结构的关键。
一般来说,定义一个类,如果这个类有多种实现方式,比如说线性表List可以用数组Array和链表Chain这两种形式来实现,那么这个时候我们就要把List所应该具备有的基本功能抽象出来,作为所有不同方法实现线性表的公共接口。其他类如果要调用线性表,那么它只需要实例化一个List类就可以了,而不关心这个List到底是ArrayList还是ChainList。
扩展开来,我推荐在写类的时候,先把这个类应该有的功能抽象出来作为一个独立的H文件。比如Class Element类,我们就把它分开为Element.h和Element.c,其中Element.h是Class Element的应该有的功能的抽象,说白了,就是Element的接口
//Element.h
Class Element{
Object value;//元素类所存放的值,这是一个抽象的void*,意味着可以存放任何类型的数据
void (*destroy)(Class Element *this);//销毁
void (*clear)(Class Element *this);//清除,把value的内容free掉
Class Element *prior;//前驱节点
Class Element *next; //后继节点
};
接下来就是对这个接口的实现了Element.c
void Element_Destroy(Class Element *this){
this->clear(this);
free(this);
}
void Element_Clear(Class Element *this){
if(this->value != Null)
free(this->value);
}
Class Element *Element_new(Object value){
Class Element *this = (Class Element*)malloc(sizeof(Class Element));
this->destroy = Element_Destroy;
this->clear = Element_Clear;
this->value = value;
this->prior = Null;
this->next = Null;
return this;
}
这里简单说明一下一个特殊方法(函数)的命名规则,当然这个规则是我自己定的啦。就是实例化这个类的时候我们统一一个格式 Class 类名 *实例名 = 类名_new([参数]);
就拿这个Class Element来说,如果我们要实例化这个类,则
Class Element *e = Element_new( Integer_new(100) );
还记得const.h中定义的Integer把, 就是#define Integer int*。
下面是一个使用Class Element的程序例子
#include "const.h"
#include "Element.h"
#include "Element.c"
int main(void){
Class Element *e = Element_new( Integer_new(100) );
printf("%d/n",*(Integer)e->value);
e->clear(e);
e = Element_new( String_new("Hello MM!") );
printf("%s/n",(String)e->value);
e->destroy(e);
return 0;
}
输出:
100
Hello MM!