多态性(计算机科学)
在编程语言理论和类型理论中,多态性是指为不同类型的实体提供一个单一的接口,或者使用一个符号来代表多个不同的类型。这个概念借用了生物学中的一个原则,即一个生物体或物种可以有许多不同的形式或阶段。最普遍认可的多态性的主要类别是。特设多态性:为一组任意的单独指定的类型定义一个共同的接口。参数多态性:不指定具体的类型,而是使用可以替代任何类型的抽象符号。子类型(也称为子类型多态性或包含多态性):当一个名字表示许多不同类的实例时,由一些共同的超类联系起来。历史对多态类型系统的兴趣在20世纪60年代有了很大的发展,在这十年结束时开始出现实际实现。特别多态性和参数多态性最初在ChristopherStrachey的《编程语言的基本概念》中被描述,它们被列为多态性的两个主要类别。特设多态性是Algol68的一个特点,而参数多态性是ML类型系统的核心特点。在1985年的一篇论文中,PeterWegner和LucaCardelli提出了包容多态这一术语,以模拟子类型和继承,并引用Simula作为xxx个实现它的编程语言。
多态性(计算机科学)的类型
特设多态性ChristopherStrachey选择了特设多态性这个术语来指那些可以应用于不同类型的参数的多态性函数,但这些函数的行为会因其所应用的参数的类型而不同(也被称为函数重载或操作符重载)。在这种情况下,术语adhoc并没有贬义,它只是指这种多态性不是类型系统的基本特征。在下面的Pascal/Delphi的例子中,当看到调用时,Add函数似乎在各种类型上通用,但在所有的意图和目的中,被编译器认为是两个完全不同的函数。程序Adhoc。在动态类型的语言中,情况可能更复杂,因为需要调用的正确函数可能只有在运行时才能确定。隐式类型转换也被定义为多态性的一种形式,被称为胁迫多态性。
参数化多态性
参数化多态性允许一个函数或一个数据类型被通用地编写,这样它就可以统一地处理数值而不依赖于它们的类型。参数多态性是一种使语言更具表现力的方法,同时仍然保持完全的静态类型安全。参数多态性的概念同时适用于数据类型和函数。一个可以对不同类型的值进行评估或应用的函数被称为多态函数。一个可以显示为广义类型的数据类型(例如,一个具有任意类型元素的列表)被指定为多态数据类型,就像广义类型一样,这种特殊化是由广义类型产生的。参数多态性在函数式编程中无处不在,在这里它经常被简单地称为多态性。下面的例子在Haskell中显示了一个参数化的列表数据类型和两个关于它们的参数化多态函数。

参数多态性在几种面向对象的语言中也是可用的。例如,C++和D中的模板,或者在C#、Delphi、Java和Go中以泛型为名。JohnC.Reynolds(以及后来的Jean-YvesGirard)正式发展了这个多态性的概念,作为lambdacalculus的扩展(称为多态lambdacalculus或SystemF)。任何参数化的多态函数在它能做的事情上必然受到限制,它对数据的形状而不是它的值进行处理,从而导致了参数化的概念。
子类型化
有些语言采用子类型化(也称为子类型多态性或包容多态性)的概念来限制在多态性的特定情况下可以使用的类型范围。在这些语言中,子类型化允许编写一个函数来接收某个类型T的对象。