C语言中的面向对象

面向对象能够实现对一类东西通过通一的接口来访问和操作,
并在扩展功能的时候保持这种访问接口的统一性和不变性,
大部分高级语言,如C++,Java,Python等都提供了这一特性。
最近阅读一个叫作log4C的日志库的源代码,发现其中似乎
用到了这一特性,的确比较神奇,遂整理出来,与大家分享参研。

为了大家阅读方便,我尽量把其中不相关的内容去除,留下本质。

日志库的设计需要考虑很多使用条件,有时候是往文件中记日志,
有时候是网络流中记日志,有时候是往存储卡中记日志,可以对
各种不同类似的日志的操作几乎都是一样的,无非是打开(open)、
追强(append)和关闭(close),这正好满足面向对象的设计思路。
我们定义抽象类:


可以看出这个C语言版的抽象类,其实就是带几个函数指针的结构体。
有了抽象类,再来看一个具体实现类stream.c中的代码:

最关键的地方是最后定义了一个实例log4c_appender_type_stream。
这个实例的方法的名称是"stream",而三个操作分别在上面定义。
你也可以如泡炮制,继承出带有新功能的新的log4c_appender_type_t。

再看一下如何调用这个实例,原文件中的调用是将log4c_appender_type_t
聚合到了一个log4c_appender结构体中,代码如下:

你可以通过设置切换app_type来对日志器进行切换。

 

我不知道这种方法算不算得上是面向对象,但至少有那么一点意思。
而且从很多this变量来看,已经说明设计者是用OOP的思想来设计这断代码的。
不过这种面向对象与真正的面向对象还有几个区别:
(1)实例只能是一个,并且固定为全局或静态变量。
(2)就以上的代码而言,只能作一次继承。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值