前次整顿了一篇对于面向目标的条记:《甚么是面向目标?》。浅显地分享了面向目标的一些底子常识。
C谈话虽不是面向目标的谈话,但也能够利用面向目标的思维来打算咱们的程序。
C谈话+面向目标的思维在咱们嵌入式中利用得很宽广,要紧好处便是能使咱们的软件拓展性更好、更易读、更轻易维持等。
由于这一齐常识也对比紧要,属于通用常识,是以筹算分享几篇条记与众人一同研习一下。
自然,C谈话并不是面向目标的谈话,要想统统完竣与C++相同的一些面向目标的个性会对比难。是以咱们分享的实质也面向底子、适用的为主。
本篇条记分享的是:封装与笼统。
封装与笼统封装性是面向目标编程的三大个性(封装性、承袭性、多态性)之一,但也是最紧要的个性。封装+笼统相分离就能够对外供给一个低耦合的模块。
数据封装是一种把数据和操纵数据的函数系缚在一同的机制,数据笼统是一种仅向用户败露接口而把详细的完竣细节暗藏起来的机制。
在C谈话中,数据封装能够从机关体动手,机关体里能够放数据成员和操纵数据的函数指针成员。自然,机关体里也能够只包括着要操纵的数据。
上面以一个浅显的实例做为演示。
打算一个软件模块,模块中要操纵的目标是长方形,需求对外供给的接口有:
1、树立长方形目标;
2、配置长、宽;
3、获得长方形面积;
4、打印长方形的音信(长、宽、高);
5、节略长方形目标。
上面咱们来一同完竣这个demo代码。首先,咱们思量一下,咱们的接口定名大假如奈何的?原来这是有规律可循的,咱们看RT-Thread的面向目标接口是何如打算的:
咱们也模拟如许子的定名样式来给咱们这个demo的几个接口定名:
1、rect_create2、rect_set3、rect_getArea4、rect_display5、rect_delete
咱们树立一个rect.h的头文献,在这边证实咱们对外供给的几个接口。这功夫咱们头文献能够打算为:
如许做是没有甚么题目的。但是数据暗藏得不敷好,咱们供给应外部用的东西要尽管浅显。
咱们能够思量一下,对于C谈话的文献操纵,C谈话库给咱们供给何如样的文献操纵接口?如:
左右滑动观察全体代码
FILE*fopen(constchar*pathname,constchar*mode);size_tfread(void*ptr,size_tsize,size_tnmemb,FILE*stream);
咱们会树立一个文献句柄(形貌符),尔后以后唯有操纵这个文献句柄就能够,咱们不必关切FILE详细是何如完竣的。
甚么是句柄?看一下百度百科的表明:
咱们也能够树立咱们的目标句柄,对外供给的头文献中唯有败露咱们的目标句柄,不必败露详细的完竣。以上面文献rect.h代码能够批改成:
这边用到了void*,其为无表率指针,void*能够指向任何表率的数据。尔后详细要操纵何如样的机关体能够在.c中完竣:
上面咱们次序完竣上述五个函数:
1、rect_create函数左右滑动观察全体代码
/*树立长方形目标*/HandleRectrect_create(constchar*object_name){printf("%s:%s(line:%d)\n",__FILE__,__FUNCTION__,__LINE__);/*给rect机关体变量分派内存*/pRectrect=(pRect)malloc(sizeof(Rect));if(NULL==rect){//free(rect);//rect=NULL;abort();}/*给rect-object_name字符串请求内存*/rect-object_name=(char*)malloc(strlen(object_name)+1);if(NULL==rect-object_name){//free(rect-object_name);//rect-object_name=NULL;abort();}/*给机关体各成员举办初始化*/strncpy(rect-object_name,object_name,strlen(object_name)+1);rect-length=0;rect-width=0;return((HandleRect)rect);}
rect目标树立函数:首先分派内存,尔后对rect机关体各个成员举办赋值操纵,末了返回的是rect目标句柄。rect的object_name成员是个字符串,因而要独自分派内存。
2、rect_set函数左右滑动观察全体代码
/*配置长方形目标长、宽*/voidrect_set(HandleRectrect,intlength,intwidth){printf("%s:%s(line:%d)\n",__FILE__,__FUNCTION__,__LINE__);if(rect){((pRect)rect)-length=length;((pRect)rect)-width=width;}}3、rect_getArea函数
左右滑动观察全体代码
/*获得长方形目标面积*/intrect_getArea(HandleRectrect){return(((pRect)rect)-length*((pRect)rect)-width);}4、rect_display函数
左右滑动观察全体代码
/*打印显示长方形目标音信*/voidrect_display(HandleRectrect){printf("%s:%s(line:%d)\n",__FILE__,__FUNCTION__,__LINE__);if(rect){printf("object_name=%s\n",((pRect)rect)-object_name);printf("length=%d\n",((pRect)rect)-length);printf("width=%d\n",((pRect)rect)-width);printf("area=%d\n",rect_getArea(rect));}}5、rect_delete函数
左右滑动观察全体代码
voidrect_delete(HandleRectrect){printf("%s:%s(line:%d)\n",__FILE__,__FUNCTION__,__LINE__);if(rect){free(((pRect)rect)-object_name);free(rect);((pRect)rect)-object_name=NULL;rect=NULL;}}
rect目标节略函数:主假如对树立函数中的malloc请求的内存做释放操纵。
能够看到这五个目标接口要紧包括三类:树立目标函数、操纵函数、节略目标函数。这边的操纵函数便是rect_set函数、rect_getArea函数与rect_display函数,自然还能够有另外更多的操纵函数。
操纵函数的特色是起码需求传入一个示意目标的句柄,在函数的内部再做本质数据机关的更动,尔后再举办响应的操纵。
6、测试程序:左右滑动观察全体代码
#includestdio.h#includestdlib.h#include"rect.h"intmain(void){HandleRectrect=rect_create("rect_obj");//树立Rect目标句柄rect_set(rect,20,5);//配置rect_display(rect);//打印显示rect_delete(rect);//节略Rect目标句柄return0;}运转成果:
在基于目标的编程中,封装性是最底子也最紧要的实质。其目标要紧包括两方面实质:属性与办法。
在基于C谈话的目标编程中,能够利用句柄来示意目标,即句柄指向的数据机关的成员代表目标的属性,本质操纵句柄的函数则示意目标的办法。
以上便是本次的分享,若有差错,迎接指出!
本篇条记干系代码可在