基于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,...);

结语

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

相关推荐
Freak嵌入式1 天前
一文速通 Python 并行计算:13 Python 异步编程-基本概念与事件循环和回调机制
开发语言·python·嵌入式·协程·硬件·异步编程
不脱发的程序猿1 天前
SoC程序如何使用单例模式运行
linux·嵌入式
鑫宇吖1 天前
Polyspace作为MISRA-C合规性检查工具,其检查规则会根据目标C语言标准(C90或C99)动态调整限值要求。
c语言·嵌入式·c99·c90·polyspace·misra-c合规性检查
用户1259265423202 天前
使用 Git LFS 管理大文件并上传至 GitHub
嵌入式
巫山老妖2 天前
Linux流量分析:tcpdump&wireshark
linux·嵌入式
不脱发的程序猿2 天前
Linux守护进程
linux·嵌入式
desssq3 天前
嘉立创黄山派下载watch ui demo 教程(sf32)
ui·嵌入式·嘉立创·黄山派
趣多多代言人3 天前
从零开始手写嵌入式实时操作系统
开发语言·arm开发·单片机·嵌入式硬件·面试·职场和发展·嵌入式
DIY机器人工房3 天前
代码详细注释:通过stat()和lstat()系统调用获取文件的详细属性信息
linux·嵌入式
DIY机器人工房3 天前
代码详细注释:ARM-Linux字符设备驱动开发案例:LCD汉字输出改进建议开发板断电重启还能显示汉字,显示汉字位置自定义
linux·嵌入式·文件io·diy机器人工房