*******************************************************************************
C中可移植的继承性和多态性2
Fr: [ESP-9712-code]
By: Miro Samek
Rd: Amine Chen[amine@263.net]
*******************************************************************************
快速参考:
=========
本文解释如下这些"设计模式"在C中的实现:
封装性,继承性,多态性.
类继承: 单继承; 接口继承: 多继承.
用C语言进行面向对象编程
*******************************************************************************
C中可移植的继承性和多态性2
Fr: [ESP-9712-code]
By: Miro Samek
Rd: Amine Chen[amine@263.net]
*******************************************************************************
快速参考:
=========
本文解释如下这些"设计模式"在C中的实现:
封装性,继承性,多态性.
类继承: 单继承; 接口继承: 多继承.
抽象基类 'Object'
----------------
Object类在类层次的根部.该类封装了虚指针,并定义了虚析构函数.为了效率,将构造和
析构函数定义为'inline'宏.它们都被保护(只能由子类访问),因为该类只想用于继承.客户
不应创建'Object'对象.
该类还声明几个私有方法(某些是类方法,也就是没有'this'指针). 因为这些方法要求
类型转换(只在一定的上下文中合法),所以只通过宏使用它们.
声明类
------
1.使用宏CLASS开始类的声明;
2.宏IMPLEMENTS用于想实现的每个接口;
3.声明类属性(实例变量);
4.用宏VTABLE声明虚函数.宏参数必须于CLASS的一致;
5.宏EXTENDS用于IMPLEMENTS声明的每个接口;
6.声明所有虚方法的函数指针;
7.用宏声明类方法;
8.为类实现的所有public&protected方法声明原型.
9.用宏END_CLASS结束类声明.
#include "object.h"
CLASS(Shape, Object) /* class Shape extends Object */
IMPLEMENTS(Scaleable); /* and implements Scaleable interface */
struct String name; /* public name (object composition) */
VTABLE(Shape, Object) /* Shape's VTABLE extends Object */
EXTENDS(Scaleable); /* and also extends Scaleable */
double (*Area)(Shape); /* virtual method to compute area */
METHODS
/* protected constructor (single '_' in the name)
* means that Shape is an abstract class
*/
Shape Shape_Con(Shape this, char *name);
void Shape_Des(Shape this); /* protected destructor */
END_CLASS
声明接口
--------
接口表示为函数指针的结构(VTABLE).接口可扩展其他接口.
1.使用宏INTERFACE开始接口的声明;
2.宏EXTENDS用于想继承的每个接口(可选);
3.声明该接口引入的所有抽象方法指针.每个方法必须声明第一个参数为Object类型;
4.用END_INTERFACE宏结束声明;
#include "object.h"
INTERFACE(Scaleable)
void (*Scale)(Object, double);
END_INTERFACE
INTERFACE(Fooable)
EXTENDS(Scaleable); /* interface Fooable extends Scaleable */
int (*Foo)(Object, long);
END_INTERFACE
绑定虚函数
----------
虚函数在类描述器(VTABLE)中声明为函数指针.VTABLEs必须为每个类定义和初始化.
分配实现函数给相应的函数指针.
1.使用BEGIN_VTABLE为给定的类定义类描述器constructor;
2.用VMETHOD将抽象类方法绑定到它们的实现;
3.用IMETHOD将抽象接口方法绑定到它们的实现;
4.用END_VTABLE结束虚拟表声明.