快过年了,手头的工作慢慢也就少了,所以,研究技术的时间就多了很多时间,前些天在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++特有的,而是所有OOP具有的特性. 由于C++语言支持这三个特性,所以学习C++时不可避免的要理解这些概念. 而在大部分C++教材中这些概念是作为铺垫,接下来就花大部分 ...

  2. php面向对象 封装继承多态 接口、重载、抽象类、最终类总结

    1.面向对象 封装继承多态  接口.重载.抽象类.最终类 面向对象 封装继承多态  首先,在解释面向对象之前先解释下什么是面向对象? [面向对象]1.什么是类? 具有相同属性(特征)和方法(行为)的一 ...

  3. OOP三大核心封装继承多态

    OOP支柱 3 个核心:封装 继承 多态 封装就是将实现细节隐藏起来,也起到了数据保护的作用. 继承就是基于已有类来创建新类可以继承基类的核心功能. 在继承中 另外一种代码重用是:包含/委托,这种重用 ...

  4. java面向对象(封装-继承-多态)

    框架图 理解面向对象 面向对象是相对面向过程而言 面向对象和面向过程都是一种思想 面向过程强调的是功能行为 面向对象将功能封装进对象,强调具备了功能的对象. 面向对象是基于面向过程的. 面向对象的特点 ...

  5. Java三大特性(封装,继承,多态)

    Java中有三大特性,分别是封装继承多态,其理念十分抽象,并且是层层深入式的. 一.封装 概念:封装,即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别:将抽象得到的数据 ...

  6. Java基础——面向对象(封装——继承——多态 )

    对象 对象: 是类的实例(实现世界中 真 实存在的一切事物 可以称为对象) 类: 类是对象的抽象描述 步骤: 1.定义一个类 (用于 描述人:) ( * 人:有特征和行为) 2.根据类 创建对象 -- ...

  7. Python 入门 之 面向对象的三大特性(封装 / 继承 / 多态)

    Python 入门 之 面向对象的三大特性(封装 / 继承 / 多态) 1.面向对象的三大特性: (1)继承 ​ 继承是一种创建新类的方式,在Python中,新建的类可以继承一个或多个父类,父类又可以 ...

  8. python面向对象(封装,继承,多态)

    python面向对象(封装,继承,多态) 学习完本篇,你将会深入掌握 如何封装一个优雅的借口 python是如何实现继承 python的多态 封装 含义: 1.把对象的属性和方法结合成一个独立的单位, ...

  9. Python设计模式 - 基础 - 封装 & 继承 & 多态

    面向对象的核心是对象,世间万物都可以看作对象,任何一个对象都可以通过一系列属性和行为来描述,可以包含任意数量和类型的数据或操作.类是用来描述具有相同属性和方法的所有对象的集合.类通常是抽象化的概念,而 ...

随机推荐

  1. 物料REVISION控制

    --新增 INV_ITEM_REVISION_PUB.Create_Item_Revision ( p_api_version IN NUMBER , p_init_msg_list IN VARCH ...

  2. sql group句子

    rollup SELECT employee_id,department_id,job_id,SUM(salary) FROM employees WHERE department_id <60 ...

  3. Android之触摸手势检测GestureDetector使用详解

    在Android中,当用户触摸屏幕的时候,会产生许多手势,例如down,up,scroll,filing,onSingleTapConfirmed(单击),onDoubleTap(双击)等等. 一般情 ...

  4. iOS开发之自己封装的提示框(警告框)样式BHAlertView

    最近需要使用到提示框(警告框)进行信息的展示和提醒,所以进行了一个类的封装,想用Swift调用此OC文件,但是发现有些困难,所以暂时先把OC代码进行展示,随后再好好研究一下在Swift中的使用. 对于 ...

  5. Apache Commons Configuration读取xml配置

    近期项目自己手写一个字符串连接池.因为环境不同有开发版本.测试版本.上线版本.每一个版本用到的数据库也是不一样的.所以需要能灵活的切换数据库连接.当然这个用maven就解决了.Apache Commo ...

  6. 登录ssh时Host key verification failed错误

    工作中总是测试不同的路由设备, 路由器的ip都是 192.168.111.1 ,ssh登录的时候总是出现这个错误. macos上,错误如下 spawn ssh -p 22 root@192.168.1 ...

  7. Android摄像头照相机技术-android学习之旅(八)

    简介 Android SDK支持Android设备内置的照相机.从Android2.3开始支持多个摄像头(主要指前置摄像头和后置摄像头).通过照片相可以拍照和录像. 需要考虑的问题 是否支持照相机 快 ...

  8. Java基础---Java---IO流-----LineNumberReader方法及原理、自定义一个LineNumberReader、字节流、图片复制、mp3复制、

    LineNumberReader 跟综行号的缓冲字符输入流,些类定义了setLineNumber(int)和getLineNumber(int),它们可分别用于设置和获取当前行号 import jav ...

  9. android开发之broadcast学习笔记

    android中的广播用的太多了,今天稍微总结一下. 按注册方式分为两种: 1.静态注册广播: 静态注册广播就是在androidManifest.xml文件中注册广播,假设我们要实现这样一个效果,在一 ...

  10. Nginx中502和504错误详解

    在使用Nginx时,经常会碰到502 Bad Gateway和504 Gateway Time-out错误,下面以Nginx+PHP-FPM来分析下这两种常见错误的原因和解决方案. 1.502 Bad ...