临时多态性

编辑
本词条由“匿名用户” 建档。

在编程语言中,临时多态性是一种多态性,其中多态性函数可以应用于不同类型的参数,因为一个多态性函数可以表示许多不同的和潜在的异质的实现,这取决于它所应用的参数类型。 当应用于面向对象或程序性概念时,它也被称为函数重载或运算符重载。在这种情况下,术语adhoc并不是贬义的;它只是指这种多态性不是类型系统的基本特征这一事实。 这与参数化多态性相反,在参数化多态性中,多态性函数的编写没有提到任何特定的类型...

简介

编辑

编程语言中,临时多态性是一种多态性,其中多态性函数可以应用于不同类型的参数,因为一个多态性函数可以表示许多不同的和潜在的异质的实现,这取决于它所应用的参数类型。

当应用于面向对象或程序性概念时,它也被称为函数重载或运算符重载。在这种情况下,术语adhoc并不是贬义的;它只是指这种多态性不是类型系统的基本特征这一事实。

这与参数化多态性相反,在参数化多态性中,多态性函数的编写没有提到任何特定的类型,因此可以以一种透明的方式将单一的抽象实现应用于任何数量的类型。

这种分类是由ChristopherStrachey在1967年提出的。

早期的绑定

编辑

特有的多态性是一种调度机制:通过一个命名的函数移动的控制被调度到其他各种函数,而不必指定被调用的确切函数。重载允许以相同的名字定义不同类型的多个函数;编译器或解释器自动确保正确的函数被调用。这样一来,就可以编写附加整数列表、字符串列表、实数列表等的函数,并全部调用append--正确的append函数将根据被附加的列表的类型被调用。

这与参数化多态性不同,在参数化多态性中,函数需要通用地编写,以适用于任何种类的列表。使用重载,可以让一个函数根据传递给它的输入类型执行两种完全不同的事情;这在参数化多态性中是不可能的。

另一种看待重载的方式是,一个例程不是由它的名字,而是由它的名字和参数的数量、顺序和类型的组合来唯 一识别的。这种类型的多态性在面向对象的编程语言中很常见,其中许多语言允许操作符以类似于函数的方式被重载(参见操作符重载)。一些非动态类型的语言,缺乏特别的多态性(包括类型类),其函数名称较长,如print_int、print_string等。这可以被看作是优势(描述性更强)或劣势(过于冗长),取决于个人的观点。

有时从重载中获得的一个好处是出现了专业化,例如,一个具有相同名称的函数可以用多种不同的方式来实现,每一种方式都针对它所操作的特定数据类型进行了优化。这可以为那些由于性能原因需要专门针对多种情况的代码提供一个方便的接口。

缺点是,类型系统不能保证不同实现方式的一致性。由于重载是在编译时完成的,所以它不能替代子类型化多态性中的后期绑定。

晚期绑定

编辑

尽管有前一节的规定,临时多态性还有其他的方式可以实现。例如,考虑一下Smalltalk语言。在Smalltalk中,重载是在运行时完成的,因为每个重载消息(重载函数)的方法(函数实现)都是在即将执行时解决的。

这发生在运行时,即程序被编译之后。因此,多态性是由子类型化多态性给出的,就像其他语言一样,它也是在运行时通过特设的多态性来扩展功能的。

仔细观察还可以发现,Smalltalk提供的临时多态性的种类略有不同。

多态性

由于Smalltalk有一个晚期绑定的执行模型,而且它为对象提供了处理不被理解的消息的能力,因此可以使用多态性来实现功能,而不用明确地重载某个特定的消息。这可能不是日常编程中普遍推荐的做法,但在实现代理时,它可能相当有用。

另外,虽然在一般情况下,普通的类方法和构造函数重载不被认为是多态性,但在一些比较统一的语言中,类是常规对象。

例如,在Smalltalk中,类是常规对象。反过来,这意味着发送到类的信息可以被重载,而且还可以创建行为类似于类的对象,而其类不继承于类的层次结构

这些都是有效的技术,可以用来利用Smalltalk强大的反射功能。类似的安排在Self和Newspeak等语言中也是可行的。

内容由匿名用户提供,本内容不代表vibaike.com立场,内容投诉举报请联系vibaike.com客服。如若转载,请注明出处:https://vibaike.com/170669/

(6)
词条目录
  1. 简介
  2. 早期的绑定
  3. 晚期绑定

轻触这里

关闭目录

目录