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

简介:

         快过年了,手头的工作慢慢也就少了,所以,研究技术的时间就多了很多时间,前些天在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,那么除了带来几个唾沫星,还能有什么受用呢?无非白费了口舌而已。

希望和大家共勉。

目录
相关文章
|
5月前
|
设计模式
**工厂模式与抽象工厂模式**都是创建型设计模式,用于封装对象创建,减少耦合
【6月更文挑战第23天】**工厂模式与抽象工厂模式**都是创建型设计模式,用于封装对象创建,减少耦合。工厂模式专注于单个对象,通过具体工厂创建具体产品,适用于简单对象创建;抽象工厂则关注一系列相关产品,提供创建一族对象的接口,适用于处理多个不兼容产品族。选择模式基于问题域的复杂性,单个产品需求时用工厂模式,多产品族时用抽象工厂模式。
32 5
|
1月前
|
C语言
C语言链式结构之有头单链表再封装写法
本文介绍了如何使用C语言对有头单链表进行封装,包括节点的创建、链表的初始化、数据的插入和删除,以及链表的打印等功能。
15 1
|
6月前
|
存储 C语言 C++
从C语言到C++_31(unordered_set和unordered_map介绍+哈希桶封装)(上)
从C语言到C++_31(unordered_set和unordered_map介绍+哈希桶封装)
55 3
|
6月前
|
C语言
从C语言到C++_29(红黑树封装set和map)红黑树迭代器的实现(下)
从C语言到C++_29(红黑树封装set和map)红黑树迭代器的实现
47 3
|
6月前
|
编译器 C语言 C++
从C语言到C++_31(unordered_set和unordered_map介绍+哈希桶封装)(中)
从C语言到C++_31(unordered_set和unordered_map介绍+哈希桶封装)
49 2
|
5月前
|
设计模式 Java 数据库
Java设计模式:桥接模式实现灵活组合,超越单一继承的设计之道(十)
Java设计模式:桥接模式实现灵活组合,超越单一继承的设计之道(十)
|
6月前
|
存储 C语言
从C语言到C++_31(unordered_set和unordered_map介绍+哈希桶封装)(下)
从C语言到C++_31(unordered_set和unordered_map介绍+哈希桶封装)
44 1
|
6月前
|
存储 编译器 C语言
从C语言到C++_23(多态)抽象类+虚函数表VTBL+多态的面试题(下)
从C语言到C++_23(多态)抽象类+虚函数表VTBL+多态的面试题
59 1
|
6月前
|
存储 编译器 Linux
从C语言到C++_23(多态)抽象类+虚函数表VTBL+多态的面试题(中)
从C语言到C++_23(多态)抽象类+虚函数表VTBL+多态的面试题
66 1
|
6月前
|
编译器 测试技术 C语言
从C语言到C++_29(红黑树封装set和map)红黑树迭代器的实现(上)
从C语言到C++_29(红黑树封装set和map)红黑树迭代器的实现
38 0