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

结语

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

相关推荐
hugerat3 小时前
在AI的帮助下,用C++构造微型http server
linux·c++·人工智能·http·嵌入式·嵌入式linux
linweidong7 小时前
AUTOSAR配置文件(ARXML)版本不一致时如何管理?
嵌入式·autosar
charlie11451419120 小时前
嵌入式现代C++教程: 构造函数优化:初始化列表 vs 成员赋值
开发语言·c++·笔记·学习·嵌入式·现代c++
CS创新实验室21 小时前
AI 与编程
人工智能·编程·编程语言
凉、介1 天前
SylixOS 中的 Unix Socket
服务器·c语言·笔记·学习·嵌入式·sylixos
三万棵雪松1 天前
【AI小智硬件程序(四)】
人工智能·嵌入式·esp32·ai小智
不脱发的程序猿2 天前
嵌入式开发中C++内存泄漏的场景与解决办法
单片机·嵌入式硬件·嵌入式
Jason_zhao_MR2 天前
V2G 实战:SECC GreenPHY 通信开发方案
嵌入式硬件·物联网·嵌入式·边缘计算
星火开发设计2 天前
C++ set 全面解析与实战指南
开发语言·c++·学习·青少年编程·编程·set·知识
Channon_3 天前
专题六:二进制日志的暗黑魔法——结构化数据与跨平台解析
嵌入式