【UML+OOPC嵌入式C语言开发】C语言使用OOPC的接口机制实现多态
创始人
2024-05-29 17:33:26
0

文章目录

  • 知识讲解
  • 函数示例
  • 相关文章

知识讲解

介绍多态

  多态是指对于同一个消息,不同的类对象会做出不同的反应。
  在面向对象语言中(java)中,多态与继承通常是一起使用的。通常是让父类对象引用其子类对象,而多态就体现在方法调用时,父类会根据实际引用对象的类型来确定最终使用某个类的方法。
  比如:Student类继承了Person类,而在实际调用时,会判断当前类的数据类型,最终执行Person对象买票全价,Student对象买票半价。

oopc中使用接口实现多态
  oopc中使用接口实现多态,本质上也是结构体的合理利用。(这里小编就不过多赘述了,如果大家有兴趣可以去看看小编的这篇文章 lw_oopc框架中接口讲解)
  本次是需要实现:使用类shape继承circle类、square类,最后再使用shape实现多态。(这里需要说明java中没有多继承)

  在本次基于oopc进行面向对象开发时,由于一个类是无法直接继承另外两个类的,因此这里使用用接口INTERFACE来实现多继承。
  这也就是说,shape类是直接"继承"了接口baseShape的,而具体的多态体现只有等到调用接口baseShape时才能够具体体现,例如:当我们接口中的函数vGetValueByname()时,就会根据类的名字返回值。实现框架图大家可以看看下图:
在这里插入图片描述
  在接口实现的多继承中,从存储上来看,不同的类是使用数组存储的,也就是说,每次调用某一个类时,还需要遍历数组,查找这个类的存储位置。如下图就是一个存储示例:
在这里插入图片描述
  与常见的面向对象语言一样(java),oopc框架下,参与多态的各个类也是需要实现各自的方法,例如:
  圆类实现计算面积:

// 计算面积
static float cGetArea(void*p)
{circle*pthis = (circle*)p;return 3.14*pthis->baseShape.value*pthis->baseShape.value;
}

  正方形类实现计算面积:

// 计算面积
static float sGetArea(void*p)
{square*pthis = (square*)p;return pthis->baseShape.value*pthis->baseShape.value;
}

  当然了,实现某个具体的方法后,还需要使用 构造器CTOR 或 自己初始化 将其加入到类中。

函数示例

测试使用的main函数:

int main(void)
{// 形状类shape*sh = (shape*)shape_new();sh->vInit(sh,10);// 圆类1circle*c1 = (circle*)circle_new();c1->baseShape.vInit(c1,"circle 1",2);// 添加存储sh->vAddShape(sh,c1);// 圆类2circle*c2 = (circle*)circle_new();c2->baseShape.vInit(c2,"circle 2",3);// 添加存储sh->vAddShape(sh,c2);// 正方形类1square*s1 = (square*)square_new();s1->baseShape.vInit(s1,"square 1",4);// 添加存储sh->vAddShape(sh,s1);// 正方形类2square*s2 = (square*)square_new();s2->baseShape.vInit(s2,"square 2",6);// 添加存储sh->vAddShape(sh,s2);// 遍历打印for(int i=0;ishapeCount;++i){printf("name:%s   area:%.3f  \n",sh->list[i]->vGetMyName(sh->list[i]),\sh->list[i]->vGetMyarea(sh->list[i]));}// 由名字查找值printf("find1:%.2f\n",sh->vGetValueByname(sh,"123"));printf("find2:%.2f\n",sh->vGetValueByname(sh,"square 2"));return 0;
}

类的定义:

// 接口
INTERFACE (baseShape)
{char name[10];float value;void (*vInit) (void*,char*,float);float (*vGetMyarea) (void*);char* (*vGetMyName) (void*);float (*vGetMyValue) (void*);
};// 圆类
CLASS (circle)
{IMPLEMENTS (baseShape);
};// 正方形类
CLASS (square)
{IMPLEMENTS (baseShape);
};// 形状类
CLASS (shape)
{int shapeCount;int shapeSize;void (*vInit) (void*,int);float (*vGetValueByname) (void*,char*);int (*vAddShape) (void*,void*);baseShape**list;
};

类的实现:

/******** 圆类 ***********/
// 初始化
static void cInit(void*p,char*name,float value)
{circle*pthis = (circle*)p;strcpy(pthis->baseShape.name,name);pthis->baseShape.value = value;
}
// 获取名字
static char* cgetMyName(void*p)
{circle*pthis = (circle*)p;return pthis->baseShape.name;
}
// 获取名字
static float cgetMyValue(void*p)
{circle*pthis = (circle*)p;return pthis->baseShape.value;
}
// 计算面积
static float cGetArea(void*p)
{circle*pthis = (circle*)p;return 3.14*pthis->baseShape.value*pthis->baseShape.value;
}
// 使用构造器构造类
CTOR (circle)FUNCTION_SETTING(baseShape.vInit,cInit);FUNCTION_SETTING(baseShape.vGetMyarea,cGetArea);FUNCTION_SETTING(baseShape.vGetMyName,cgetMyName);FUNCTION_SETTING(baseShape.vGetMyValue,cgetMyValue);
END_CTOR/************ 正方形类   *****************/
// 初始化
static void sInit(void*p,char*name,float value)
{square*pthis = (square*)p;strcpy(pthis->baseShape.name,name);pthis->baseShape.value = value;
}
// 获取名字
static char* sgetMyName(void*p)
{square*pthis = (square*)p;return pthis->baseShape.name;
}
// 获取名字
static float sgetMyValue(void*p)
{square*pthis = (square*)p;return pthis->baseShape.value;
}
// 计算面积
static float sGetArea(void*p)
{square*pthis = (square*)p;return pthis->baseShape.value*pthis->baseShape.value;
}
// 使用构造器构造类
CTOR (square)FUNCTION_SETTING(baseShape.vInit,sInit);FUNCTION_SETTING(baseShape.vGetMyarea,sGetArea);FUNCTION_SETTING(baseShape.vGetMyName,sgetMyName);FUNCTION_SETTING(baseShape.vGetMyValue,sgetMyValue);
END_CTOR/********* 接口类   ******/
//初始化形状类
static void initShape(void*p,int size)
{shape*pthis = (shape*)p;pthis->shapeCount = 0;pthis->shapeSize = size;pthis->list = (baseShape**)malloc(sizeof(baseShape*)*pthis->shapeSize);
}
// 向形状类添加一个形状
static int addShape(void*p,void*newP)
{shape*pthis = (shape*)p;if(pthis->shapeCount+1 > pthis->shapeSize)return -1;baseShape*newp = (baseShape*)newP;pthis->list[pthis->shapeCount++] = newp;return 0;
}//获取形状的边长或者半径
static float getValueByname(void*p,char*name)
{shape*pthis = (shape*)p;for(int i=0;ishapeCount;++i){if(strcmp(name,pthis->list[i]->vGetMyName(pthis->list[i])) == 0)return pthis->list[i]->vGetMyValue(pthis->list[i]);}return -1;
}// 使用构造器构造类
CTOR (shape)FUNCTION_SETTING(vInit,initShape);FUNCTION_SETTING(vAddShape,addShape);FUNCTION_SETTING(vGetValueByname,getValueByname);
END_CTOR

示例代码的储存示例:
在这里插入图片描述

运行结果:
在这里插入图片描述

相关文章

  博主也整理了一些其他文章,欢迎大家翻阅!!!🤤🤤🤤

  • 【UML+OOPC嵌入式C语言开发】使用C语言实现一个面向对象语言才能够实现的类

相关内容

热门资讯

挫折让我感受到成功作文 挫折让我感受到成功作文  谁都希望自己的人生是一帆风顺,鲜花和掌声人人都想要,可是挫折往往就在成功的...
未来世界的800字作文 未来世界的800字作文  在学习、工作、生活中,大家总少不了接触作文吧,作文是一种言语活动,具有高度...
假如我是钢铁侠作文_小学生作... 假如我是钢铁侠作文_小学生作文  在日常的学习、工作、生活中,大家都经常看到作文的身影吧,作文要求篇...
宇宙大战_小学作文 宇宙大战_小学作文  在日常的学习、工作、生活中,大家都跟作文打过交道吧,写作文可以锻炼我们的独处习...
柏林战争想象作文350字 柏林战争想象作文350字  我是苏联陆军第十三师的列兵米勒。  1945年4月,我们在队长老柯莱蒂的...
军训感受的作文 军训感受的作文(精选43篇)  在日复一日的学习、工作或生活中,大家对作文都再熟悉不过了吧,作文一定...
做更好的自己作文 做更好的自己作文(4篇)  无论在学习、工作或是生活中,大家都不可避免地会接触到作文吧,作文是由文字...
国王与啄木鸟童话故事 国王与啄木鸟童话故事  在平平淡淡的日常中,大家都有写故事的经历,下面是小编帮大家整理的国王与啄木鸟...
诗情画意作文 诗情画意作文14篇  在日常生活或是工作学习中,大家都经常看到作文的身影吧,作文是经过人的思想考虑和...
展望未来作文400字 展望未来作文400字(精选8篇)  在现实生活或工作学习中,大家都经常接触到作文吧,写作文是培养人们...
为自己作文 为自己作文集合15篇  在生活、工作和学习中,大家总免不了要接触或使用作文吧,作文是人们以书面形式表...
勇敢的小刺猬童话作文 勇敢的小刺猬童话作文(3篇)  在日常学习、工作或生活中,大家一定都接触过作文吧,写作文是培养人们的...
土豆童话作文 有关土豆童话作文五篇  无论是身处学校还是步入社会,大家都经常接触到作文吧,作文是从内部言语向外部言...
草船借箭的故事缩写 草船借箭的故事缩写(通用94篇)  诸葛亮,他是我最崇拜的古人之一,他神机妙算,料事如神,上知天文下...
写读后感作文 关于写读后感作文(通用40篇)  看完一本名著后,相信大家一定领会了不少东西,需要好好地就所收获的东...
启蒙童话故事 启蒙童话故事大全【三篇】启蒙童话故事大全【三篇】1  这天小鹿骄傲的说,我是跑的最快的,小兔不服气,...
植物观察日记 植物观察日记(精选50篇)  忙碌而又充实的一天又过去了,在你心中有什么感想呢?让我们今天做个总结,...
大蒜发芽观察日记 大蒜发芽观察日记(精选26篇)  不知不觉中一天又要结束了,这一天里,大家身边一定有一些有趣的见闻吧...
伴你入梦散文 伴你入梦散文  “亲爱的,吻你30口,当我吻完的时候,如果你没有说话,我也去睡了。”隔着手机,我温柔...
介绍自己的作文 关于介绍自己的作文7篇  在日常学习、工作和生活中,大家对作文都再熟悉不过了吧,借助作文人们可以实现...