设计模式——C语言的面向对象

        在大学的第一门计算机课程里,大家都知道了面向过程与面向对象的概念,更形象、更流行的说法是:C是面向过程的;C++比C高级,是面向对象。但在很多人心中都会有这样的疑问:掌握了C++语言,就掌握了面向对象的方法吗?又有多少人用C++写出的是C语言风格的代码?
        所以 ,我更趋向认为,面向对象是一种思想、方法,而不是一种编程语言。诚然,像C++、java这样的语言在面向对象编程中能发挥的更加游刃有余,因为其许多语言特性能更好的支撑面向对象的思想。但这并不意味着用C就不能写出面向对象的代码,在linux内核(C语言实现)中面向对象的思想比比皆是,特别是在文件系统中,一个VFS将其玩的出神入化。
        在面向对象中,三大重要属性是:封装、继承和多态。如果用C语言能实现这3种属性,是否也就可以面向对象了呢?答案是肯定的,在网上已有太多的前辈来解析用C来模仿C++的语言特性,如何写C++风格的代码。可我还是认为:面向对象是一种思想,每种语言都有其自己的语言特性,能利用其自身的特性写出面向对象的代码,才是真正的理解了面向对象的思想。
        现在,简单的列举一下如何用C语言来表示面向对象的三大重要属性,然后在后续的文章中描述用C语言中的设计模式。

1、封装

struct _ObjectStruct;

typedef void (*handle)(struct _ObjectStruct* _data); 

typedef struct _ObjectStruct
{
    int data; //表示属性
    handle handle_data; //函数指针,表示行为
}ObjectStruct;

这样,属性、行为就被封装在一个结构体里面,在行为handle中,其参数即为结构体指针,通过这个指针便能获取结构体中的属性。这样便完美统一了。


2、继承

typedef void (*process)(struct _ConcreteStruct* _data) ;

typedef struct _ConcreteStruct
{
    ObjectStruct object;
    int concreteData;
    process process_data;
}ConcreteStruct;

将父类以组合的方式放在子类中的首位置,这样子类便继承父类的一切属性和行为。


3.多态

ConcreteStruct* concrete = (ConcreteStruct*)malloc(sizeof(ConcreteStruct));
process_data = process_data_A;
//process_data = process_data_B;
concrete->process_data(concrete);

接口的多种不同的实现方式即为多态。通过函数指针的晚绑定来实现。在对对象concrete进行操作时,并不需要关心其行为的具体实现方式,我们只需调用concrete->process_data(concrete); 即可,而process_data可以有多种不同的实现方式。

        不可否认的是:在这三种属性上,C++、java语言支持的更加完美。但能在代码中处处流露出对象的韵味才是最牛逼的,接下来利用设计模式来体现C语言的面向对象思想。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值