以需要提供半成品的实现:
/* 设置动物的昵称*/
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"
);