
都知道C语言是面向过程的,但是现在软件规模越来越大,通过面向对象的方式可以简化开发。业余时间想了个简单的方法,在C中使用一部分面向对象的基本功能。由于C语言自身的限制,并不完善,只能将就用,聊胜于无,如果大家有好的想法可以一起讨论。
首先还是老规矩上代码: http://files.cnblogs.com/GhostZCH/object.rar
面向对象有三个基本属性:封装、继承和多态。 此处一一讲解处理方法。
1. 封装,基本思想就是用结构体代替类,属性没什么好说的,方法就麻烦点只能用函数指针了,基本思想和JS差不多,“函数就是对象的一个属性”。 缺点试试无法控制访问的私有和公用。由于C没有this指针,只好在每个函数都增加一个void*的参数将自己传进去。
{
ClassID m_uiCID;
ToString_PF pfToString;
};
{
sprintf(pcStrBuf, }
OBJECT_STRU *new_Object()
{
OBJECT_STRU* pstObj = (OBJECT_STRU*)malloc(
{
}
pstObj->m_uiCID = CID_OBJ;
pstObj->pfToString = OBJ_ToString;
}
2继承:继承的方法是用类似组合的方式,将父类结构体作为子类的第一个属性,注意,这里必须是第一个,这样后面的强制类型转换才会有效。通过强制转换转换成父类。
1 /************************************************************************/
{
sprintf(pcStrBuf, ((ANIMAL_STRU *)pObj)->acName,
((ANIMAL_STRU *)pObj)->m_stBaseObj.m_uiCID);
}
ANIMAL_STRU *new_Animal()
{
ANIMAL_STRU* pstObj = (ANIMAL_STRU*)malloc(
{
}
pstObj->m_stBaseObj.m_uiCID = CID_ANM;
pstObj->m_stBaseObj.pfToString = ANM_ToString; ] =
}
三,多态,通过挂载不同的函数指针实现
] = {};
OBJECT_STRU *pObj = NULL;
ANIMAL_STRU *pAnm = NULL;
PLANT_STRU *pPlt = NULL;
OBJECT_STRU *pObj_plant = NULL;
printf( free(pObj);
pObj = NULL;
strcpy(pAnm->acName, printf( free(pPlt);
free(pAnm);
pPlt = NULL;
pAnm = NULL;
strcpy(pPlt->acName, printf(
pObj_plant = (OBJECT_STRU *)new_Plant();
printf(
getchar();
free(pObj_animal);
free(pObj_plant );
;
}
OBJECT_STRU *pObj = NULL;
ANIMAL_STRU *pAnm = NULL;
PLANT_STRU *pPlt = NULL;
OBJECT_STRU *pObj_plant = NULL;
printf( free(pObj);
pObj = NULL;
strcpy(pAnm->acName, printf( free(pPlt);
free(pAnm);
pPlt = NULL;
pAnm = NULL;
strcpy(pPlt->acName, printf(
pObj_plant = (OBJECT_STRU *)new_Plant();
printf(
getchar();
free(pObj_animal);
free(pObj_plant );
;
}