莫把重载当多态

偶一次,和一两个同事一起面试一个MM,鉴于MM几乎没有工作经验,但是至少是计算机专业的,我只想了解一下她的基础知识掌握的如何,我问了一下面向对象的三个基本特征;她回答道: 封装、继承和多态。

其实,封装、继承基本没什么不好理解的,但是多态却经常有人不理解。而且我也没想提问这个。我的一个同事A却提了个问题:PHP支持多态吗?PHP中的多态如何实现?

MM没能回答上来,我想,如果不是特别清楚的话,现在一定是要回答不上来的,因为面试官已经开始错了。同事A接着便自信地说:其实PHP不支持多态,但是实现起来却也很简单。我知道同事A错了,但是我对这个概念也有一些模糊了,便不想揭穿他,自己就默不作声,任由他们讨论。令我羞愧的是,另一同事B也和他们一起说起默认参数和几个参数的问题了,我彻底无语。不怕你不懂,就怕你错了还不知道自己错了。

多态不是重载,重载也不是覆盖;面向对象中,如果不能区分多态、重载、覆盖这几个概念,那么面向对象就是没有学好。

我们说:

  1.     我有一个函数move(animal),有一个参数是”动物“;如果你给的参数是老鹰,那么该函数表现出来的形态就是fly;如果你给的参数是小鸡,那么该函数表现出来的形态就是run; 这个叫多态(Polymorphism)。多态在C++中是通过虚函数来实现的,如果你是学C++的,你不了解虚函数,那么你一定不了解多态。
  2. 有多个可以接受不同个数、或类型的参数的同名函数,那么这个叫重载(  overload)。可以说,重载不属于面向对象领域(特有)的概念
  3.  如果子类定义了和父类完全相同的方法,那么这个叫覆盖
  4. 重载不是面向对象领域的概念

 

但愿我说明白了,参考文档:

  • http://baike.baidu.com/view/126521.htm
  • http://baike.baidu.com/view/126530.htm

留下评论

邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据