Steve McConnell在《code complete》中提到一个概念:programming in a language 和 programming 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);
....
};spa
用相似以上的结构,将数据和method打包起来。设计
值得一提的是,以上的这种组合形式,提供的operation基本上至关于OO中的public method。C语言自己不内建OO支持,因此没办法对方法定义一些code
属性。然而,实际上,咱们是能够找到对应于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)ip
水平有限,就写到这里吧。不对之处,若是有热心的朋友发现,还请指正,不甚感激。