快过年了,手头的工作慢慢也就少了,所以,研究技术的时间就多了很多时间,前些天在CSDN一博客看到有大牛在讨论C的设计模式,正好看到了,我也有兴趣转发,修改,研究一下。

记得读大学的时候,老师就告诉我们说,C语言是一门面向过程的语言,C++,java,C#是面向对象的语言。C++有三个最重要的特点,即继承、封装、多态。等到后来随着编码的增多和工作经验的积累,我也慢慢明白了面向对象的含义。可是,等我工作以后,使用的编程语言更多的是C语言,这时候我又想能不能把C语言变成面向对象的语言呢?等到后来通过思考和实践,我发现其实C语言也是可以面向对象的,也是可以应用设计模式的,关键就在于如何实现面向对象语言的三个重要属性。

从软件设计层面来说,一般来说主要包括三个方面:

(1)软件的设计受众,是小孩子、老人、女性,还是专业人士等等;

(2)软件的基本设计原则,以人为本、模块分离、层次清晰、简约至上、适用为先、抽象基本业务等等;

(3)软件编写模式,比如装饰模式、责任链、单件模式等等。

(1)继承性

typedef struct _parent
{ int data_parent; }Parent; typedef struct _Child
{ struct _parent parent; int data_child; }Child; 

在设计C语言继承性的时候,我们需要做的就是把基础数据放在继承的结构的首位置即可。

这样,不管是数据的访问、数据的强转、数据的访问都不会有什么问题。

(2)封装性

struct _Data; typedef void (*process)(struct _Data* pData); typedef struct _Data
{ int value; process pProcess; }Data; 

封装性的意义在于,函数和数据是绑在一起的,数据和数据是绑在一起的。

这样,我们就可以通过简单的一个结构指针访问到所有的数据,遍历所有的函数。

封装性,这是类拥有的属性,当然也是数据结构体拥有的属性。

(3)多态

typedef struct _Play
{ void* pData; void (*start_play)(struct _Play* pPlay);
}Play; 

多态,就是说用同一的接口代码处理不同的数据。

比如说,这里的Play结构就是一个通用的数据结构,我们也不清楚pData是什么数据,start_play是什么处理函数?

但是,我们处理的时候只要调用pPlay->start_play(pPlay)就可以了。

剩下来的事情我们不需要管,因为不同的接口会有不同的函数去处理,我们只要学会调用就可以了。

在我个人看来,我认为设计模式就是一种基本思想,过度美化或者神化其实没有必要。其实阅读过linux kernel的朋友都知道,linux虽然自身支持很多的文件系统,但是linux自身很好地把这些系统的基本操作都抽象出来了,成为了基本的虚拟文件系统。而且linux本身就是C语言的一个近似完美的产物,研究linux,等于学习C语言的精华。

打个比方,在面对对象程序设计中,如果我们要完成一个类似的音乐播放器,你可能会这么去写:

classmusic_file
{ HANDLE hFile; public: void music_file() {} virtual ~music_file() {} virtual void read_file() {} virtual void play() {} virtual void stop() {} virtual void back() {} virtual void front() {} virtual void up() {} virtual void down() {}
}; 

但其实,我们用C语言也可以完成一个同样的抽象产物。

typedef struct_music_file
{ HANDLE hFile; void (*read_file)(struct _music_file*pMusicFile); void (*play)(struct _music_file*pMusicFile); void (*stop)(struct _music_file*pMusicFile); void (*back)(struct _music_file*pMusicFile); void (*front)(struct _music_file*pMusicFile); void (*down)(struct _music_file*pMusicFile); void (*up)(struct _music_file*pMusicFile);
}music_file; 

当然,例子很简单,但可以说明一些问题。活学活用,既不要迷信权威,也不要妄自菲薄。只要付出努力,付出汗水,肯定会有收获的。有些大环境你改变不了,那就从改变自己开始。万丈高楼平地起,一步一个脚印才能真真实实学到东西。如果盲目崇拜,言必google、微软、apple,那么除了带来几个唾沫星,还能有什么受用呢?无非白费了口舌而已。

希望和大家共勉。

C语言设计模式-封装-继承-多态相关推荐

  1. c语言编程 菲薄拉,C语言设计模式-封装-继承-多态

    快过年了,手头的工作慢慢也就少了,所以,研究技术的时间就多了很多时间,前些天在CSDN一博客看到有大牛在讨论C的设计模式,正好看到了,我也有兴趣转发,修改,研究一下. 记得读大学的时候,老师就告诉我们 ...

  2. Java继承_Hachi君浅聊Java三大特性之 封装 继承 多态

    Hello,大家好~我是你们的Hachi君,一个来自某学院的资深java小白.最近利用暑假的时间,修得满腔java语言学习心得.今天小宇宙终于要爆发了,决定在知乎上来一场根本停不下来的Hachi君个人 ...

  3. python多态的三种表现形式_python小结----面向对象的三大特征(封装,继承,多态)

    面向对象的三大特征: 封装,继承,多态 面向对象的编程思想核心:高类聚,低耦合–程序的设计模式范畴 封装 什么是封装: 在面向对象编程的思想中,对代码进行高度封装,封装又叫包装 封装就是指将数据或者函 ...

  4. python 参数类型的多态_【Python】面向对象:类与对象\封装\继承\多态

    六.Python面向对象--类与对象\封装\继承\多态 1.什么是面向对象编程 1.1 程序设计的范式:程序可控,易于理解 1.2 抽象并建立对象模型 1.3 程序是不同对象相互调用的逻辑.每个对象在 ...

  5. 大数据笔记8—java基础篇4(面向对象-封装-继承-多态)

    面向对象 一.面向对象 1.面向过程 1.2.举例 1.3.总结 二.面向对象 1.简述 2.举例 3.思想特点 2.1.类的定义格式 2.1.1.简述 2.2.2.格式 2.3.3.示例 三.类的使 ...

  6. 小白理解——封装继承多态

                                      一.封装 是什么:首先是抽象,把事物抽象成一个类,其次才是封装.对外表示为一个对象,隐藏对象的属性和动作实现的细节,仅对外公开接口. ...

  7. python--编写程序:实现乐手弹奏乐器,乐手可以弹奏不同的乐器而发出不同的声音------使用类的封装继承多态的问题/使用面向对象的思想,设计自定义类,描述出租车和家用轿车的信息

    编写程序:实现乐手弹奏乐器,乐手可以弹奏不同的乐器而发出不同的声音 ------使用类的封装继承多态的问题 class Instrumnet():#乐器类def make_sound(self):pa ...

  8. Day55-每日一道Java面试题-Java 面向对象编程三大特性: 封装 继承 多态

    Java 面向对象编程三大特性: 封装 继承 多态 封装 封装把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法,如果属性不想被外界访问,我们大可不必提供方法给外界访问.但是如果一个类没有 ...

  9. 面向对象 编程及面向对象三大属性:封装 继承 多态

    面向对象 面向对象(Object Oriented,OO)是软件开发方法.面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统.交互式界面.应用结构.应用平台.分布式系统.网络管理结构. ...

最新文章

  1. Android多媒体分析-通过MediaStore获取Audio信息
  2. 使用Django1.11创建简单的资产管理平台
  3. JavaScript属性操作
  4. subversion for linux redhat as5的安装
  5. ITK:遮罩图像的归一化相关性
  6. 导师都有哪些“秘密”没有告诉你?
  7. java基础—List集合的常规方法操作
  8. 总结C++中取成员函数地址的几种方法
  9. 关于Cocos2d-x中GameController的定义
  10. html页面之间传表格,如何在html 页面插入一个表格,参数的传递,
  11. 15款顶级开源人工智能工具推荐
  12. CAN通讯矩阵之Intel格式与Motorola格式
  13. Introduction to Computer Networking学习笔记(二十四):拥塞控制 TCP Reno
  14. Xilinx差分输入时钟100Ω终端电阻设置
  15. zip、rar等密码破解软件
  16. Visio 2013最新产品密钥分享,在安装时可以使用以下密钥:
  17. 洛谷-P1883-函数最小值
  18. 游戏程序员的2012年终总结
  19. linux tig不支持中文,解决git log 以及tig命令中文乱码问题
  20. python 列表查重_用python对excel查重

热门文章

  1. .NET开发的大型网站列表、各大公司.NET职位精选,C#王者归来
  2. ORAN专题系列-16:5G O-RAN FrontHaul前传接口的网络配置管理协议netconf
  3. BGP MPLS VPN(OPTION A)实验笔记
  4. VS2017到哪里去下载
  5. Java Json和yaml转换
  6. shell脚本的编写
  7. 用javascript编写的打字小游戏
  8. 离心机 TFN A17CH 微量高速冷冻离心机 17800r/min 触摸屏 轻型便捷微量高速
  9. 计算机二级c语言考试真题及答案详解,全国计算机二级考试C语言复习题与答案解析...
  10. SQL Server 日志文件查看器提示超时连接