(1)类的实现
在面向对象思想的表述中,类是对现实世界事物的抽象表述。在c++和java的语法中用关键字class来表示面向对象的类。那么很明显的在c语言的语法中结构体struct和类的表述最为接近,故我们使用c的关键字struct定义结构体来表述对应的类。根据面向对象的思想抽象出具体事物的属性作为结构体struct的成员变量。
(2)类的封装
对于java编程实践有一个基本的原则,一个文件实现一个类,类名与文件名相同,以一个文件作为基本的编程单元。那么在c语言的时间中我们也可以借鉴这一原则。我们把c语言的头文件和实现文件名以(命名空间_类名)的形式命名。然后在这个文件中定义类的struct结构体,结构体名为命名空间_类名,然后抽象出类的属性作为成员变量。然后在这个文件中定义类的方法,方法的命名规则为"命名空间_类名 _动词_名词"的形式,命名空间类似java的包名或是c++的namespace注意命名空间不用像java一样写那么长的包名,方法的第一个参数为struct结构体的指针。对于公共方法和变量在头文件中声明并用extern关键则修饰,对于私有方法和变量使用static关键字修饰,但不要在头文件中声明。对于保护变量因为暂时没找到相应的实现,暂时用公共方法和变量的方法来实现以后找到后会补充。对于类的构造函数和解析函数,我们使用定义额外两个函数表示:struct 类名 * 命名空间_类名_creat(参数列表);和void 命名空间_类名_release(struct 类名 *);
(3)类的继承
类的继承我使用结构体的包含关系来实现,即子类的第一个成员变量的类型为父类的类型。例如
struct parent{
}
struct child{
struct parent p;
}
(3)类的多态
类的多态我们使用函数指针来实现。即对需要实现多态的方法,定义一个接口类结构体例如struct shape_ops;并作为类的成员变量。然后定义这个接口的操作方法
float shape_area(struct shape* s) /求形状面积/
{
return s->s_ops->so_area(s);
}
int shape_perimeter(struct shape* s) /求周长/
{
return s->s_ops->so_perimeter(s);
}
最后在每个类的构造函数中通过对接口函数指针赋不同值得方法实现多态。
(4)类的相互关系
我们使用包含相关类的对应结构体的变量的方式表达类的相互关系:继承(实现)、关联(依赖)、组合、聚合。