background image

以需要提供半成品的实现:

/* 设置动物的昵称*/

void

 Animal_setName(Animal* t, 

const

 

char

* name)

{

    

// 这里假定name不会超过128个字符,为简化示例代码,不做保护(产品代码中不要这

样写)

    strcpy(t->name, name);

}

/* 设置动物的年龄*/

void

 Animal_setAge(Animal* t, 

int

 age)

{

    t->age = age;

}

/* 动物和我们打招呼*/

void

 Animal_sayHello(Animal* t)

{

    printf(

"Hello! 我是%s,今年%d岁了!\n"

, t->name, t->age);

}

/* 初始化动物的昵称和年龄*/

void

 Animal_init(Animal* t, 

const

 

char

* name, 

int

 age)

{

    t->setName(t, name);
    t->setAge(t, age);

}

ABS_CTOR(Animal)

FUNCTION_SETTING(setName, Animal_setName);

FUNCTION_SETTING(setAge, Animal_setAge);

FUNCTION_SETTING(sayHello, Animal_sayHello);

FUNCTION_SETTING(init, Animal_init);

END_ABS_CTOR

这里出现了几个新的宏,我们逐个进行讲解。ABS_CTOR 表示抽象类的定义开始,

ABS_CTOR(Animal)的含义是 Animal

抽象类的 构造函数 开始。在 C 语言里边其实是没有

C++ 中 的 构 造 函 数 的 概 念 的 。 LW_OOPC 中 的 CTOR 系 列 宏
(CTOR/END_CTOR,ABS_CTOR/END_ABS_CTOR)除了给对象(在 C 语言中是 struct
实例)分配内存,然后,紧接着要为结构体中的函数指针成员赋值,这一过程,也可以
称为函数绑定(有点类似 C++中的动态联编)。函数绑定的过程由 FUNCTION_SETTING
宏来完成。

对于 Fish 和 Dog 类的实现,与 Animal 基本上是类似的,除了将 ABS_CTOR 换成了

CTOR,直接参见代码:

/* 

 

鱼的吃行为 */

void

 Fish_eat(Animal* t)

{

    printf(

"鱼吃水草!\n"

);