闻成 发表于 2025-6-9 08:53:51

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

前言

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

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

对象的基本结构就是抽象出对对象最本质的认识,即类型定义;一个类可以有多个对象,而对象与对象之间不仅是逻辑分离的,也是物理分离的,虽然可以用相同的方法和属性。但在C语言中要想实现多例,就必须传入该对象的引用,当然可以实现更简单的多例模式,目前我知道的只有单线程的情况下才能保证安全,可以参考c语言实现this指针效果里的多例实现方式,保守点,还是更推荐传入引用的方式。
/* 前向声明 */
struct _AnyObject;
/* 对象基本结构定义 */
typedef struct{
        /* 可直接访问属性 */
        anytype Attr1;
        anytype Attr2;
        /* 可间接访问属性 */
        struct{
                anytype _Attr3;
                /* 通过指针可实现访问私有属性 */
                anytype *_Attr4;
        }PrivatedAttr;
        /* 初始化方法 可以部分模拟C++的构造函数,当然析构函数也可以同样方式模拟 */
        anytype (*Init)(struct _AnyObject *,anytype,...);
        /* 接口方法 */
        anytype (*Func1)(struct _AnyObject *,anytype,...);
        anytype (*Func2)(struct _AnyObject *,anytype,...);
}AnyObject;一般情况下,对象都具有属性和方法,并且还有访问权限的限制,但C语言存在的访问权限方式似乎无法对结构体成员单独进行控制,const似乎也无法实现。所以私有属性和方法只能以文件级的static来进行访问限制了,而对象结构体里面使用一个嵌套结构体作为另一种表征对象私有属性的方式,寄希望于人的自觉;同时如果需要的话,这样也提供了一种外部访问真正static私有属性的一种方式,无非就是指针的使用。
初始化方法与接口定义

主要用于初始化对象的属性和接口方法的分配,可以为每个对象定义各自的初始化方法和接口方法,当然也可以用同一种方法,但要保证方法的可重入性。
如果对标C++的用法时,有些东西是编译器自动建立的,但是在纯C中,就必须手动设计了。比如C++可类内定义函数,也可类外定义函数,只要指定限定域就可以,并且C++的构造函数也是自动调用的,但是C语言中,只能在类外定义,然后手动绑定到相应的函数指针,需要有初始化方法,即构造函数里面就是为了做这些工作的,不幸的是,这个模拟的构造函数必须手动放在合适的地方显式的调用,这个就是需要注意的地方了。
/* 初始化方法 */
anytype Obj1_Init(AnyObject *obj,anytype arg,...){
        /* 属性初始化 */
        obj->Attr1 = arg;
        /* 接口方法分配定义 */
        obj->Func1 = &Obj1_Func1;
}/* 接口方法定义 */
anytype Obj1_Func1(AnyObject *obj,anytype arg,...){
        /* 操作对象属性 */
}实例化对象

/* 实例即定义,必须为每个对象分配好初始化函数或所谓构造函数 */
AnyObject obj1 = {.Init = Obj1_Init};
AnyObject obj2 = {.Init = Obj2_Init};
/* obj1_init可以和obj2_init一样 */
/* 需要手动进行初始化 */
obj1.Init(anytype,...);
obj2.Init(anytype,...);this指针

c语言实现this指针效果
这种方式对于单例很方便,简化方法调用方式,不用每次都传入引用,但对于多例就要考虑线程安全问题了。
链式调用

主要通过返回对象自身的引用来实现。
AnyObject *ChainFunc(AnyObject *,anytype,...);结语

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

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: 基于C语言的面向对象设计模式(持续更新)