什么是子类型
编辑在编程语言理论中,子类型(也称子类型多态性或包容多态性)是类型多态性的一种形式,其中子类型是一种数据类型,它与另一种数据类型(超类型)通过某种可替代性的概念联系在一起,这意味着程序元素,通常是子程序或函数,写成对超类型元素的操作也可以对子类型的元素操作。如果S是T的一个子类型,子类型关系(写成S<:T,S⊑T,或S≤:T)意味着任何类型的术语S可以安全地用于任何预期有T类型的术语的上下文。这里的子类型的精确语义主要取决于如何安全地使用和任何上下文的细节,这些细节由一个给定的类型形式主义或编程语言来定义。一个编程语言的类型系统基本上定义了它自己的子类型关系,如果该语言不支持(或很少支持)转换机制,这很可能是微不足道的。由于子类型关系,一个术语可能属于一个以上的类型。因此,子类型化是类型多态性的一种形式。在面向对象编程中,术语"多态性"通常只指这种子类型多态性,而参数化多态性的技术将被视为通用编程。函数式编程语言通常允许记录的子类型化。因此,用记录类型扩展的简单类型化lambda微积分也许是最简单的理论环境,在这种环境中可以定义和研究有用的子类型化概念。因为所产生的微积分允许术语有一个以上的类型,它不再是一个简单的类型理论。
由于函数式编程语言,根据定义,支持函数字词,这些字词也可以存储在记录中,带有子类型的记录类型提供了一些面向对象编程的特征。通常,函数式编程语言也提供一些,通常是有限的,参数化多态性的形式。在理论环境中,研究这两个特征的相互作用是可取的;一个常见的理论环境是系统F<:。试图捕捉面向对象编程的理论特性的各种计算方法可以从系统F<:中导出。子类型的概念与语言学上的hyonymy和holonymy的概念有关。它还与数理逻辑中的有界量化概念有关(见顺序排序逻辑)。子类型不应该与面向对象语言中的(类或对象)继承概念相混淆;子类型是类型之间的关系(面向对象语言中的接口),而继承是实现之间的关系,源于允许从现有对象创建新对象的语言特性。在一些面向对象的语言中,子类型化被称为接口继承,而继承则被称为实现继承。
子类型的起源
编辑编程语言中的子类型概念可以追溯到20世纪60年代;它被引入到Simula衍生工具中。1980年,JohnC.Reynolds和LucaCardelli(1985年)对子类型进行了xxx次正式处理,他使用类别理论对隐式转换进行了正式处理。随着面向对象编程的主流采用,子类型的概念已经获得了知名度(在一些圈子里与多态性同义)。在这种情况下,安全替换原则通常被称为Liskov替换原则,这是以BarbaraLiskov的名字命名的,她在1987年的面向对象编程会议上发表的主题演讲中普及了该原则。因为它必须考虑到可变的对象,所以由Liskov和JeannetteWing定义的理想的子类型概念,称为行为子类型,比类型检查器中可以实现的要强得多。(详见下面的§函数类型)。
子类型的例子
编辑一个简单的子类型的实际例子在图中显示。鸟的类型有三个子类型:鸭子、布谷鸟和鸵鸟。从概念上讲,每一个都是基本类型鸟的一个品种,它继承了许多鸟的特性,但有一些特殊的区别。在这个图中使用了UML符号,开放的箭头显示了超类型和其子类型之间关系的方向和类型。作为一个更实际的例子,一种语言可能允许整数值被用于期望有浮点值的地方(Integer<:Float),或者它可能定义一个通用类型Number作为整数和实数的一个共同超类型。在这第二种情况下,我们只有Integer<:Number和Float<:Number,但是Integer和Float不是彼此的子类型。程序员可以利用子类型的优势,以更抽象的方式编写代码,而不是没有它。请看下面的例子。
内容由匿名用户提供,本内容不代表vibaike.com立场,内容投诉举报请联系vibaike.com客服。如若转载,请注明出处:https://vibaike.com/170828/