【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语言实现一个面向对象语言才能够实现的类

相关内容

热门资讯

高三百日誓师讲话稿 高三百日誓师讲话稿(精选22篇)  在当下社会,我们可以使用讲话稿的机会越来越多,讲话稿可以按照用途...
爱读书国旗下讲话稿 爱读书国旗下讲话稿范文(精选4篇)  在社会发展不断提速的今天,越来越多人会去使用讲话稿,讲话稿是指...
《母亲节的礼物》说课稿 《母亲节的礼物》说课稿范文  作为一名人民教师,常常要写一份优秀的说课稿,编写说课稿是提高业务素质的...
跳绳加油稿 跳绳加油稿  导语:加油稿可以激励运动健儿更好的参加运动,活跃运动的气氛。接下来小编整理了跳绳加油稿...
老师评课稿 老师评课稿(精选15篇)  所谓评课,是指对课堂教学成败得失及其原因做中肯的分析和评估,并且能够从教...
加油稿运动会   加油稿运动会(一)  微微的风,远远的地方吹来一阵微风,夹着轻轻的私语。侧耳仔细听,那是同学们的...
教师节团建活动的主持稿 2022年教师节团建活动的主持稿(精选5篇)  在发展不断提速的社会中,我们都可能会用到主持稿,主持...
《真理诞生于一百个问号之后》... 《真理诞生于一百个问号之后》说课稿范文(精选3篇)  在教学工作者实际的教学活动中,总不可避免地需要...
初三家长会优秀发言稿 初三家长会优秀发言稿范文(精选6篇)  随着社会一步步向前发展,我们可以使用发言稿的机会越来越多,发...
环保的主题征文稿 关于环保的主题征文稿  保护地球,是我们每一个人的责任,以下YJBYS小编为大家提供关于环保的主题征...
家长会学生发言稿 关于家长会学生发言稿(通用7篇)  在当下社会,用到发言稿的地方越来越多,发言稿可以帮助发言者更好的...
校运会加油稿 校运会加油稿精选10篇  在学习、工作生活中,需要使用加油稿的情境愈发增多,加油稿是一种对他人有正向...
幼儿园大班毕业典礼文艺演出主... 最新幼儿园大班毕业典礼文艺演出主持稿(精选3篇)  不经意间,我们毕业的日子就要到来,毕业典礼是我们...
结业典礼讲话稿 结业典礼讲话稿(精选21篇)  在日新月异的现代社会中,我们用到讲话稿的地方越来越多,讲话稿是领导人...
五年级家长会班主任发言稿 五年级家长会班主任发言稿(通用8篇)  家长会一般是由学校或教师发起的,面向学生、学生家长,以及教师...
小学班主任工作经验交流发言稿    [小学班主任工作经验交流会发言稿]  尊敬的各位领导,老师、亲爱的同学们:  大家好!  今天...
小学生中队委竞选稿 小学生中队委竞选稿(精选3篇)  在人们越来越重视自我提升的今天,接触并使用竞选稿的人越来越多,竞选...
通讯稿格式及 通讯稿格式及范文  电子稿:标题 黑体2号加粗,正文 宋体小四,行距1.5  1.通讯稿格式(300...
论文答辩稿是什么   毕业论文答辩以后,答辩委员会要根据毕业论文以及作者的答辩情况,评定论文成绩。在此,小编为大家准备...
退休人员在座谈会上的发言稿 退休人员在座谈会上的发言稿(通用10篇)  在发展不断提速的社会中,我们使用上发言稿的情况与日俱增,...