基于C语言的面向对象设计模式(持续更新)

前言

首先这篇文章只是初步的尝试,不涉及过于高深的编程技巧;同时需要表明的是,面向对象只是一种思想,不局限于什么样的编程语言,不可否认的是基于面向对象特性而设计的语言确实要比面向过程式的语言更加容易进行抽象和统筹,可以说面向对象的设计模式可以很大程度上摆脱过程的实例,但要论完整的应用来讲,设计模式也还是跳不出最终被过程挑选的命运,对象只是对象,过程才是对象真正的实践战场

对象设计

对象即模块,模块即文件

在C语言环境中,不要想着能实现C++这种真正面向对象特性加持的效果,我们只能实现阉割版的效果,主要还是面向对象思想的运用。

对象基本结构

对象的基本结构就是抽象出对对象最本质的认识 ,即类型定义;一个类可以有多个对象,而对象与对象之间不仅是逻辑分离的,也是物理分离的,虽然可以用相同的方法和属性。但在C语言中要想实现多例,就必须传入该对象的引用 ,当然可以实现更简单的多例模式,目前我知道的只有单线程的情况下才能保证安全,可以参考c语言实现this指针效果里的多例实现方式,保守点,还是更推荐传入引用的方式。

c 复制代码
/* 前向声明 */
struct _AnyObject;
/* 对象基本结构定义 */
typedef struct{
	/* 可直接访问属性 */
	anytype Attr1;
	anytype Attr2;
	/* 可间接访问属性 */
	struct{
		anytype _Attr3;
		/* 通过指针可实现访问私有属性 */
		anytype *_Attr4;
	}PrivatedAttr;
	/* 初始化方法 */
	anytype (*Init)(struct _AnyObject *,anytype,...);
	/* 接口方法 */
	anytype (*Func1)(struct _AnyObject *,anytype,...);
	anytype (*Func2)(struct _AnyObject *,anytype,...);
}AnyObject;

一般情况下,对象都具有属性方法,并且还有访问权限的限制,但C语言存在的访问权限方式似乎无法对结构体成员单独进行控制,const似乎也无法实现。所以私有属性和方法只能以文件级的static来进行访问限制了,而对象结构体里面使用一个嵌套结构体作为另一种表征对象私有属性的方式,寄希望于人的自觉;同时如果需要的话,这样也提供了一种外部访问真正static私有属性的一种方式,无非就是指针的使用。

初始化方法与接口定义

主要用于初始化对象的属性和接口方法的分配,可以为每个对象定义各自的初始化方法和接口方法,当然也可以用同一种方法,但要保证方法的可重入性

c 复制代码
/* 初始化方法 */
anytype Obj1_Init(AnyObject *obj,anytype arg,...){
	/* 属性初始化 */
	obj->Attr1 = arg;
	/* 接口方法分配定义 */
	obj->Func1 = &Obj1_Func1;
}
c 复制代码
/* 接口方法定义 */
anytype Obj1_Func1(AnyObject *obj,anytype arg,...){
	/* 操作对象属性 */
}

实例化对象

c 复制代码
/* 实例即定义,必须为每个对象分配好初始化函数 */
AnyObject obj1 = {.Init = Obj1_Init};
AnyObject obj2 = {.Init = Obj2_Init};
/* obj1_init可以和obj2_init一样 */
/* 需要手动进行初始化 */
obj1.Init(anytype,...);
obj2.Init(anytype,...);

this指针

c语言实现this指针效果

这种方式对于单例很方便,简化方法调用方式,不用每次都传入引用,但对于多例就要考虑线程安全问题了。

链式调用

主要通过返回对象自身的引用来实现。

c 复制代码
AnyObject *ChainFunc(AnyObject *,anytype,...);

结语

后面再学到什么新的实现会持续更新在这篇文章里,同时也接受批评和改正。

相关推荐
FreakStudio21 小时前
把 Flask 搬进 ESP32,高中生自研嵌入式 Web 框架 MicroFlask !
python·单片机·嵌入式·cortex-m3·异步编程·电子diy
楚国的小隐士1 天前
“你用AI,那我也会用AI,我还要你干什么?”
ai·大模型·编程·ai编程·哲学·氛围编程·辩证唯物主义·马列主义·唯物论
Zevalin爱灰灰1 天前
零基础入门学用物联网(ESP8266) 第一部分 基础知识篇(五)
单片机·物联网·嵌入式·esp8266
marsh02061 天前
14 openclaw模板引擎使用:高效渲染动态内容
java·前端·spring·ai·编程·技术
Zevalin爱灰灰1 天前
零基础入门学用物联网(ESP8266) 第一部分 基础知识篇(四)
物联网·嵌入式·esp8266
FreakStudio2 天前
MicroPython+PycoClaw,3 分钟搞定 ESP32 跑上 OpenClaw!
python·单片机·嵌入式·电子diy
逆小舟2 天前
【SWM320】FreeRTOS搭建工程——1、框架学习
嵌入式·c·rtos
小杨同学492 天前
STM32 进阶封神之路(二十二):DMA 实战全攻略 ——ADC 采集 + 串口收发 + 内存复制(库函数 + 代码落地)
后端·单片机·嵌入式
隔壁大炮2 天前
速度环实现行进&角度环实现转弯
嵌入式·pid·江协科技·平衡小车
busideyang2 天前
STM32中__weak(弱定义)函数核心总结
c语言·stm32·单片机·嵌入式硬件·嵌入式