C语言的多态性,你的多态你做主

    技术2022-05-20  56

    在Linux的内核代码中,多处都用到面向对象的设计理念,比如,在文件系统系统的设计中,有四个主要的对象:超级块,索引节点,目录项和文件。在每个对象定义的结构体,都有一个指向指向对象操作的结构体,在这个结构体中的所有字段都是指向函数的指针,例如file结构中的缩略定义:

    struct file

    {

      struct file_operations  *f_op;     /*指向文件操作表的指针*/

      mode_t f_mode;                     /*文件的打开模式*/

      loff_t f_pos;                        /*文件的当前位置*/ 

      

    };

     

    对文件进行操作的一组函数叫文件操作表,由file_operations结构描述:

    struct file_operations {        loff_t (*llseek) (struct file *, loff_t, int);        ssize_t (*read) (struct file *, char *, size_t, loff_t *);        ssize_t (*write) (struct file *, const char *, size_t, loff_t *);        int (*mmap) (struct file *, struct vm_area_struct *);        int (*open) (struct inode *, struct file *);        int (*flush) (struct file *);        int (*release) (struct inode *, struct file *);

    int (*fsync) (struct file *, struct dentry *, int datasync);

           };

        一直以为这样的定义是理所当然的,直到有一天,有同学问起为什么这样定义,源头在哪里?只是告诉学生去理解面向对象的思想,然后再看这里的数据结构就容易理解了。而实际上,面向对象的思想如果用结构化语言来表达,其理解难度上还是有一个坡度的。恰好在IBM developerworks网站看到“技巧:用 C 语言实现程序的多态性”一文,以形象化的语言说明了这种定义的渊源:

    前言:关于多态,关于 C

       多态 (polymorphism) 一词最初来源于希腊语 polumorphos,含义是具有多种形式或形态的情形。在程序设计领域,一个广泛认可的定义是“一种将不同的特殊行为和单个泛化记号相关联的能力”。然而在人们的直观感觉中,多态的含义大约等同于“同一个方法对于不同类型的输入参数均能做出正确的处理过程,并给出人们所期望获得的结果”,也许这正体现了人们对于多态性所能达到的效果所寄予的期望:使程序能够做到越来越智能化,越来越易于使用,越来越能够使设计者透过形形色色的表象看到代码所要触及到的问题本质。

    作为读者的你或许对于面向对象编程已有着精深的见解,或许对于多态的方便与神奇你也有了深入的认识。这时候你讶异的开始质疑了:“多态,那是面向对象编程才有的技术,C 语言是面向过程的啊!”而我想说的是,C 语言作为一种编程语言,也许并不是为了面向对象编程而设计,但这并不意味着它不能实现面向对象编程所能实现的功能,就比如说,多态性。

    在本文中我们使用一个简单的单链表作为例子,展示 C 语言是如何体现多态性的。

    结构体:不得不说的故事

    许多从写 C 代码开始,逐渐走向 C++ 的程序员都知道,其实 C++ 里面的 class,其前身正是 C 语言中的 structure。很多基于 C 语言背景介绍 C++ 的书籍,在介绍到 class 这一章的时候都会向读者清晰地展示,一个 C 语言里的 structure 是怎样逐渐变成一个典型的 C++ class 的,甚至最后得出结论:“structure 就是一个所有成员都公有的类”,当然了,class 还是 class,不能简单的把它看做一个复杂化了的 structure 而已。

    下面我们来看看在 C 语言中定义一个简单的存储整型数据的单链表节点是怎么做的,当然是用结构体。大部分人会像我一样,在 linkList.h 文件里定义:

      具体内容参看:http://www.ibm.com/developerworks/cn/linux/l-cn-cpolym/

    -----------------------------------------------------------------------------

     

      后记:本文给出的这样一个思维过程,对于把面向对象的思想与结构化语言如何结合起来,无疑起一个向导作用。     尽管本文给出了用C语言实现链表的多态性。但是内核代码list.h中对链表的经典实现(参看我以前的博文),并没有以多态的形式,但其抽象性和灵活应用的价值,在分析并实践后就能体现出来。

    最新回复(0)