多态知多少

今天看书,看到了这一句:The ability to implement polymorphism through functional overloading is not supported by PHP and probably never will be.
作为从c++开始学习面向对象的程序员,第一反应就是这个是不是说错了,通过函数重载来实现多态?我当时也大大的sb了一把,以为是印错了,或者说错了。然后在网上搜了一下多态,在有些语言中函数重载(函数名相同,参数不同的)也被称为函数的多态,理由是函数名相同,但可以表现出多种行为,自然符合多态的含义。
又从wiki查了一下多态有两种类型ad-hoc polymorphism和parametric polymorphism。ad-hoc polymorphism通过子类化和方法覆写来实现的,也就是面向对象方面的概念,而parametric polymorphism就是c++中的泛型编程,根据传递的类型参数来表现出多态。
我感觉这ad-hoc polymorphism通过子类化和方法覆写来实现的这个其实说的并不准确,这是针对静态语言来说的,在动态语言中,多态不是靠类型和继承来是实现的:
静态语言和动态语言的多态:
在静态语言中的概念中类即类型,接口即亦即类型,类型在多态中起到了重要的作用,类型决定了对象的行为。
在动态语言中类不是类型,类型是由行为决定的,这就是所谓的Duck Type的概念,能像鸭子一样行走,像鸭子一样叫的,就被称为鸭子类型。动态语言,语言是弱类型的,编译器/解释器不会检参数传递的是不是那个类型,而只会在在实际使用的时候检查是否具有这个行为。所以在动态语言中多态不是由类型决定的。在动态语言中接口的概念通常是不需要的(php5具有接口这个概念,这是在动态语言中少有的),既然这样,接口其实不是一个面向对象所必须的概念。因为在动态语言中你不能够通过接口来达到契约的作用,不需要需要通过接口编程来达到可插拔的替换掉实现的目标(在静态的面向对象语言中一直倡导的面向接口编程,这个东东其实和“面向抽象而不是具体编程”还是不一样的,他只是在静态类型的面向对象的一种表现,而“面向抽象而不是具体编程”则是一个原则高度上的东西。)。既然多态不靠类型来实现,所以也不依赖继承来实现。

你可能感兴趣的:(编程,C++,c,PHP,C#)