之前的一个版本中,在“子类”对象构造时,采用动态对象申请“父类”,然后在内存拷贝到“子类的对象”中,在“子类”的“构造函数”结束后,再让临时“父类”对象“析构”。对于本文中的例子,
animal本身是一个纯粹的抽象概念,不应该被实例化,因此animal类更像纯虚基类,仅仅提供接口就可以了,不用对其“实例化”。
下面我对这个例子进行了重构(
这里仅仅附上修改的部分,请参考原文):
//animal_base.h:
(Omit unchanged part)
/* 删除初始化函数 */
//animal_t * animal_init();
/* 删除内存释放函数 */
//void animal_die(animal_t *animal);
//animal_base.c
//删除以下函数的实现:
// animal_t * animal_init(){}
// void animal_die(animal_t *animal){}
//cat.c
// 修改cat的初始化函数
cat_t * cat_init()
{
cat_t* cat = (cat_t *)malloc(sizeof(cat_t));
animal_t temp_animal;
temp_animal.animal_ops.eat = eat;
temp_animal.animal_ops.walk = walk;
temp_animal.animal_ops.talk = talk;
cat->base = temp_animal;
return cat;
}
//dog.c
// 修改dag的初始化函数
dog_t * dog_init()
{
dog_t *dog = (dog_t *)malloc(sizeof(dog_t));
animal_t temp_animal;
temp_animal.animal_ops.eat = eat;
temp_animal.animal_ops.walk = walk;
temp_animal.animal_ops.talk = talk;
dog->base = temp_animal;
return dog;
}
题后:
程序员应该“每日三省其身”,对于前一日写的代码,每天早晨抽时间研究一下是否需要重构。写代码应该像计算数学题一样,将其尽可能实现其最优美的公式。谁说程序员是一份“青春饭”,程序员和医生一样,需要大量的经验总结和积累。