多态(Polymorphism)

OOP的三个基本特征:封装,继承和多态,而且最重要的一个是多态,于是从一开始我一直认为多态是只有OOP语言才有的特征,这在C++和Java中表现很明显,虽然也看到过一些文章说很多过程性语言也有这个特性,例如C,但还是很少见到,最近有机会接触一些其它类型的语言,发现多态真的具有普遍性,只要理解多态的本质,在设计程序的时候有多态的思想,大部分的语言都提供了实现多态的技术,只是有的复杂,有的简单;有的明显,有的隐含,不过思想的东西是不变的,抓住本质,一切都那么简单。多态的本质,仁者见仁,智者见智,我的理解:它是在不改变现有代码的基础上提供了集成未来未知功能的能力,这里未知不是任意,是要遵守一定的Contract,在Java/C++里是要实现某个接口,在C里是要实现一个接口变量。

C中的多态通过方法变量来实现:  
   1: void (*draw)( Coordinate coor );  //方法变量  
   2: void drawCircle( Coordinate coor );  
   3: void drawSquare( Coordinate coor );  
   4:    
   5: void drawGraphy( int (*_draw)( Coordinate coor ) ) {  
   6:    _draw( coor );  
   7: }  
   8:    
   9: void main() { 
 10:    draw = drawCircle; 
 11:    drawGraphy( draw );   //画园 
 12:    drawGraphy( drawSquare ); //画正方形 
 13: }

Disclaimer: 以上代码不保证正确,不保证能运行

C中的实现多态的能力不必Java/C++差,但开发人员牺牲掉的是编译时检查,例如在运行时把一个错误得方法付给某个方法变量。有时编译时检查很重要,能避免很多错误,毕竟人无完人(比如 的时候写程序),还是无感情的机器严谨。

不过很多软件设计中使用了这种方式,只是它们的设计更复杂,例如drawCircle和drawSquare是在动态链接库中实现的,这样可以实现模块化设计。我所知道的使用这种设计方式的有:

1. Linux中的Module [1]: Linux Kernel有很好的可扩展性,程序员可以很容易的开发一个Module,并且在运行时Enable or Disable 这些Module。但是Kernel这么认识这些Module呢?所以kernel就准备了一个名片模板(struct,其中有一些方法变量),每一个Module都必须根据这个模板来填写一个自己的名片(struct),这样Kernel就可以根据名片上的内容来初始化,使用和销毁这个Module。

2. Apache HTTPD中的Module [2]:HTTPD的设计和Linux Kernel很像,每个Module也需要有自己名片。

3. Harmony中的GC和JIT [3]:最近在看。Harmony可以根据用户的设置来选择不同的GC算法和不同的JIT实现,每一个GC和JIT都要在初始化的时候从动态链接库中取出方法,并填写自己的名片。

Dreaming that one day I can have my own GC ......

[1]  http://www.faqs.org/docs/kernel/
[2]  http://httpd.apache.org/docs/2.2/developer/
[3]  http://harmony.apache.org/subcomponents/drlvm/index.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值