c语言中的面向对象(2)----method的封装

Steve McConnell在《code complete》中提到一个概念:programming in a languageprogramming into a language的区别。我们做自己的项目时,正确的方法应该是,先对问题充分考察,然后分析,确定主要数据结构和主要算法,最后将自己的这些思想,用某种编程语言来实现。
言归正传,说说Linux Kernel中如何用C来部分的实现面向对象思想

这篇文章初略的谈一谈方法的封装。

我们知道,面向对象的核心思想就是封装(或者说打包), 把相关联的数据结构和方法一起封装起来,那么今后,传递该“类”对象时,其方法也

被一同传递。Linux Kernel中如何实现这种数据和方法的封装呢?如下:
struct A
{
int data;
char data2;
....
A_operation *op;
};

struct A_operation
{
void (*start)(struct A* a, int para1);
void (*compute)(struct A*, int para1, int para2);
....
};

用类似以上的结构,将数据和method打包起来。

值得一提的是,以上的这种组合形式,提供的operation基本上相当于OO中的public method。C语言本身不内建OO支持,所以没办法对方法定义一些

属性。然而,实际上,我们是可以找到对应于OO中public和prviate方法属性的实现的。在此,先再次强调,不要被语言限制!program into a language instead of in a language!

在Linux Kernel中,很多重要的对象,都称为xxx descriptor。通常它需要的一些方法,会写在xxx结构声明的同一个文件中。那么其private方法(仅供自己使用,而外界不需要看到的方法)通常就声明为了static方法;而public方法,要么用EXPORT_SYMBOL导出,要么如上作为一个struct的一个组成部分。通过这种编程级别的约定(而非语言级别的限制),在Linux Kernel中,我们看以一窥OO思想。

OO中方法的覆盖?OO中类的继承?
在Linux Kernel的实现中,我没看到明显的继承思想,覆盖倒是有些。其类的组成,扩展,清一色用的是组合的形式。比如你要定义自己的一个char device,如果是不加考虑的直接用继承,那么你回得到一个庞大的复杂的,难以维护的系统。而实际上,通常你只需要改写其file operation就可以了。这种设计策略有点类似于strategy pattern。(参考Head First Design Patterns中的strategy pattern)

水平有限,就写到这里吧。不对之处,如果有热心的朋友发现,还请指正,不甚感激。

 


 

转载于:https://my.oschina.net/u/158589/blog/59147

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值