首页 > 其他分享 >基于C语言的面向对象设计模式(持续更新)

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

时间:2024-04-10 13:56:21浏览次数:24  
标签:... AnyObject 对象 C语言 面向对象 Init anytype 设计模式 属性

前言

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

对象设计

对象即模块,模块即文件

在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指针

c语言实现this指针效果

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

链式调用

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

AnyObject *ChainFunc(AnyObject *,anytype,...);

结语

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

标签:...,AnyObject,对象,C语言,面向对象,Init,anytype,设计模式,属性
From: https://www.cnblogs.com/pie-o/p/18125356

相关文章

  • C语言中的结构体:组织与管理数据的方式》 标签: C语言
    结构体结构体的声明结构体是一种复合数据类型,它允许我们将多个不同类型的数据项组合成一个单一的实体。这与其他基本数据类型(如整数、浮点数、字符等)不同,后者通常只能存储单一类型的数据。类比:数组:一组相同元素的集合。结构的声明结构的声明使用struct关键字,后跟结构......
  • 设计模式概述
    学习设计模式的目的(1)应对面试设计模式是程序员的基本功,因此是面试中常考察的知识点。(2)写出高质量的代码学好数据结构与算法目的是写出高效的代码,学好设计模式则是为写出高质量的代码。(3)提高复杂代码的设计和开发能力掌握好设计模式才能在开发复杂系统时写出易扩展、易用......
  • 22.C语言有关程序结构循环练习
    6、【单选题】语句while(!e);中的条件!e等价于()。[2分] ***AA、e==0B、e!=1C、e!=0D、~e9、【单选题】以下叙述正确的是()。[2分] ****BA、continue语句的作用是结束整个循环的执行B、只能在循环体内和switch语句体内使用break语句C、在循环体......
  • 03-JAVA设计模式-代理模式详解
    代理模式什么是代理模式Java代理模式是一种常用的设计模式,主要用于在不修改现有类代码的情况下,为该类添加一些新的功能或行为。代理模式涉及到一个代理类和一个被代理类(也称为目标对象)。代理类负责控制对目标对象的访问,并可以在访问前后添加一些额外的操作。核心作用:通......
  • .NET 设计模式—装饰器模式(Decorator Pattern)
    简介装饰者模式(DecoratorPattern)是一种结构型设计模式,它允许你在不改变对象接口的前提下,动态地将新行为附加到对象上。这种模式是通过创建一个包装(或装饰)对象,将要被装饰的对象包裹起来,从而实现对原有对象功能的增强和扩展。角色Component(组件):定义了一个抽象接口,可以是抽象......
  • 1311: 午饭问题(c语言)
    题目描述  12点又到了,特别懒的老W又懒的去买饭,但又想吃饭,于是他让老 L 给他带饭,老L答应给他带饭,不过需要老 W 先做出一道题:     W:“给你一些数字,问你出现次数最多的数字,如果出现次数最多的数字有多个请输出最小的一个,不过最多可以有1000000个数字, 这些数......
  • 【C语言】无废话指针
    一、初识指针1.1概念及演示指针就是地址,指针变量就是存放地址的变量(你可将地址理解为门牌号,找到门牌号就找到了你要找的人) 示意代码如下: inta=10; int*p=&a;//用p指向a的地址,a的类型是(int)所以p的类型是(int*) printf("a的地址:%p\n",p);//用%p打印当前p的地址 i......
  • 每日一题:C语言经典例题之平方和排序
    题目描述输入int类型范围内的N个非负整数,要求按照各个整数的各数位上数字的平方和从小到大排序,若平方和相等,则按照数值从小到大排序。例如,三个整数9、31、13,各数位上数字的平方和分别为81、10、10,则排序结果为13、31、9。输入测试数据有多组。每组数据先输入一个整数N(0<N<1......
  • 纯C语言手搓GPT-2,前OpenAI、特斯拉高管新项目火了
    众所周知,大语言模型还在快速发展,应该有很多可以优化的地方。我用纯C语言来写,是不是能优化一大截?也许很多人开过这样的脑洞,现在有大佬实现了。今天凌晨,前特斯拉Autopilot负责人、OpenAI科学家AndrejKarpathy发布了一个仅用1000行代码即可在CPU/fp32上实现GPT-2......
  • OOP 面向对象
    转载自https://zhuanlan.zhihu.com/p/524264177并做部分内容上的补充和修改在前一章,我们学习了抽象数据类型(ADT)理论,这一章,我们学习ADT的具体实现技术:OOP类与对象什么是对象?对象都有两个特征:状态(states)和行为(behaviors)我们可以从真实世界中的对象来理解这两个特征:......