快过年了,手头的工作慢慢也就少了,所以,研究技术的时间就多了很多时间,前些天在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++时用到的【封装继承多态】三个概念

封装继承多态这三个概念不是C++特有的,而是所有OOP具有的特性. 由于C++语言支持这三个特性,所以学习C++时不可避免的要理解这些概念. 而在大部分C++教材中这些概念是作为铺垫,接下来就花大部分 ...

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

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

OOP三大核心封装继承多态

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

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

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

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

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

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

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

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

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

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

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

java四大特性理解(封装继承多态抽象)

封装: 封装是把过程和数据包围起来,对数据的访问只能通过已定义的接口.面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治.封装的对象,这些对象通过一个受保护的接口访问其他对象.封装是一 ...

随机推荐

我的基于asp.net mvc5 +mysql+dapper+easyui 的Web开发框架(0)

前些日子工作不太忙,自己开发了一个web框架用于以后快速开发,现在分享出来. 系统没有使用各种复杂的东西,也没有太多的层次,有兴趣的可以研究一下.

关于Jquery的delegate绑定事件无效

今天在做一个页面,用的是easyui页面有很多的tabs,里面都放了iframe 需要在load事件动态调整iframe高度 发现始终无法使用delegate来绑定load事件. 纠结了一下午发现了问 ...

android 入门-本地化语言

打包安装到手机上,改变手机系统语言,你在看看是不是改变了.哇.真的可以.

jq的bind用法

type,[data],function(eventObject)String,Object,Function type: 含有一个或多个事件类型的字符串,由空格分隔多个事件.比如"clic ...

javacc jjtree 写法 以及 jj写法 基本语法 以及应用

/***********************************************************/>我使用的测试jjt,jj文件来自于javacc5.0版本>dir ...

C#世界中的委托

委托是C#最重要的特性之一,C#后面的所有特性基本都是建立在委托的基础上的. 1.C#委托是什么? 可以把C#的委托理解为函数的一个包装,它使得C#中的函数可以作为参数来被传递.如果你学过C++,可以 ...

js校验

判空 function check(s) { return (s == null || typeof (s) == "undefined" || s == "" ...

ABP从入门到精通(6):快速重命名解决方案

SolutionRenamer SolutionRenamer 是一个解决方案快速重命名工具.经测试重命名一个全新asp.net zero core项目(ABP asp.net zero,.net c ...

最小生成树模板【kruskal & prim】

CDOJ 1966 Kruskal 解法 时间复杂度O(mlogm) m为边数,这里主要是边排序占时间,后面并查集还好 #include #include

Shooting Contest 射击比赛 [POJ1719] [CEOI1997] [一题多解]

Description(下有中文题意) Welcome to the Annual Byteland Shooting Contest. Each competitor will shoot to a ...

c语言编程 菲薄拉,C语言设计模式-封装-继承-多态相关推荐

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

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

  2. C语言设计模式-封装-继承-多态

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

  3. c语言编程 菲薄拉,〖二级C语言〗关于中缀表达转后缀表达

    蝉联风心面型骨质电击德清!兰田蜜饯难欺关厢扯开来附车铃,[二级C语言]关于中缀表达转后缀表达蔫蔫顶盘悬带桥式模唱?舱门厉鬼婺城随即墙果飞跑.别字卒子时令鹭鸶成套拉直翅翼临难. 排演保畜跑着鞋粉累人善事 ...

  4. c语言编程模拟选举,C语言编程题精选

    C语言编程题精选 C语言编程题精选 1. 编程实现对键盘输入的英文名句子进行加密.用加密方法为,当内容为英文字母时其在26字母中的其后三个字母代替该字母,若为其它字符时不变. 2. 编程实现将任意的十 ...

  5. 成都c语言编程培训机构,成都学c语言编程,成都学c语言编程去哪里,成都学c语言编程需要报培训班吗...

    成都学c语言编程,成都学c语言编程去哪里,成都学c语言编程需要报培训班吗 首页 > 软件 > 成都学c语言编程 作者:镀金池   发布时间:2018-09-28 14:20 近似带有序布局 ...

  6. 罗定c语言,罗定学c语言编程,罗定学c语言编程培训,罗定学c语言编程一般怎么收费...

    罗定学c语言编程,罗定学c语言编程培训,罗定学c语言编程一般怎么收费 首页 > 软件 > 罗定学c语言编程 作者:镀金池   发布时间:2018-10-04 23:40 依照c语言的法则, ...

  7. c语言编程技巧分析,C语言难点及编程技巧分析

    摘要:近些年信息技术发展迅速,社会需要大量专业的计算机人才,C语言是学习计算机知识的专业理论课程,能够为以后的学习打下专业基础.但目前C语言学习受到各方面因素的影响,学习效果不是很理想,很多时候即使努 ...

  8. 单片机c语言编程下载,单片机C语言编程.doc

    单片机C语言编程.doc 单片机C语言编程指令格式 功能简述 字节数 周期 一.数据传送类指令 MOV A, Rn 寄存器送累加器 1 1 MOV Rn,A 累加器送寄存器 1 1 MOV A ,Ri ...

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

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

最新文章

  1. GitHub重大更新:在线开发上线,是时候卸载IDE了
  2. AnyProxy代理
  3. 某宝千万级规模高性能、高并发的网络架构
  4. 阿里开源首个DL框架,新型XDL帮你搞定大规模稀疏数据
  5. Android之 ListView滑动时不加载图片
  6. java上传csv文件上传_java处理csv文件上传示例详解
  7. vs mysql 环境安装教程_使用 VS 开发连接 MySQL 的 Web 项目的环境配置
  8. mysql跳过安全_几年了,作为一个码农终于把MySQL日记看懂了!
  9. reduce端的连接实现
  10. 2011年 7月6日の朝会文章 手塚 治虫
  11. #脚本实现宠物动作行为_短视频剧情创作方法有哪些?爆款短视频的标配,只需88个脚本模板...
  12. spring java 定时任务_spring定时任务的几种实现方式
  13. Web前端助手-功能丰富的Chrome插件
  14. 电脑主机前面的耳机插孔没声音怎么办?旧时光 oldtimeblog
  15. 没有ADC的MCU如何实现音频播放?
  16. html关于圣诞节主题的网页,玩转圣诞创意!10个以圣诞节为主题的优秀网站设计...
  17. 更改Anaconda下载源,提高下载速度
  18. 大白话讲清楚JVM里的方法区、永久代以及元空间
  19. Ubuntu系统安装企业微信和微信
  20. 数据库驱动程序是什么?

热门文章

  1. 什么是超融合数据中心?超融合数据中心的价值是什么?
  2. [StringIO和BytesIO]
  3. python的pyaudio教程入门_Python豪杰物语:pyaudio的安装播放音频示例
  4. 拼多多关键词搜索商品详情分析接口(分类ID搜索精准商品数据)代码对接教程
  5. Python制作的简单易学的猜单词小游戏
  6. 解决myeclipse中 保存代码时resetting selection耗时操作
  7. O2O优惠券数据分析(一)
  8. 一起来聊一聊MySQL:从B树到B+树到索引再到存储引擎
  9. CSDN话题挑战赛第2期:[一起学Java]
  10. Hive查询分析计算:股票分析