前言
首先这篇文章只是初步的尝试,不涉及过于高深的编程技巧;同时需要表明的是,面向对象只是一种思想,不局限于什么样的编程语言,不可否认的是基于面向对象特性而设计的语言确实要比面向过程式的语言更加容易进行抽象和统筹,可以说面向对象的设计模式可以很大程度上摆脱过程的实例,但要论完整的应用来讲,设计模式也还是跳不出最终被过程挑选的命运,对象只是对象,过程才是对象真正的实践战场。
对象设计
对象即模块,模块即文件
在C语言环境中,不要想着能实现C++这种真正面向对象特性加持的效果,我们只能实现阉割版的效果,主要还是面向对象思想的运用。
对象基本结构
对象的基本结构就是抽象出对对象最本质的认识,即类型定义;一个类可以有多个对象,而对象与对象之间不仅是逻辑分离的,也是物理分离的,虽然可以用相同的方法和属性。但在C语言中要想实现多例,就必须传入该对象的引用,当然可以实现更简单的多例模式,目前我知道的只有单线程的情况下才能保证安全,可以参考c语言实现this指针效果里的多例实现方式,保守点,还是更推荐传入引用的方式。
/* 前向声明 */
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
私有属性的一种方式,无非就是指针的使用。
初始化方法与接口定义
主要用于初始化对象的属性和接口方法的分配,可以为每个对象定义各自的初始化方法和接口方法,当然也可以用同一种方法,但要保证方法的可重入性。
/* 初始化方法 */
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指针
这种方式对于单例很方便,简化方法调用方式,不用每次都传入引用,但对于多例就要考虑线程安全问题了。
链式调用
主要通过返回对象自身的引用来实现。
AnyObject *ChainFunc(AnyObject *,anytype,...);
结语
后面再学到什么新的实现会持续更新在这篇文章里,同时也接受批评和改正。
1.本站内容仅供参考,不作为任何法律依据。用户在使用本站内容时,应自行判断其真实性、准确性和完整性,并承担相应风险。
2.本站部分内容来源于互联网,仅用于交流学习研究知识,若侵犯了您的合法权益,请及时邮件或站内私信与本站联系,我们将尽快予以处理。
3.本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
4.根据《计算机软件保护条例》第十七条规定“为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。”您需知晓本站所有内容资源均来源于网络,仅供用户交流学习与研究使用,版权归属原版权方所有,版权争议与本站无关,用户本人下载后不能用作商业或非法用途,需在24个小时之内从您的电脑中彻底删除上述内容,否则后果均由用户承担责任;如果您访问和下载此文件,表示您同意只将此文件用于参考、学习而非其他用途,否则一切后果请您自行承担,如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
5.本站是非经营性个人站点,所有软件信息均来自网络,所有资源仅供学习参考研究目的,并不贩卖软件,不存在任何商业目的及用途
暂无评论内容