面向对象语言概论(二)

4. Subsumption和Dynamic Dispatch (译者按:呵呵,黔驴技穷,找不到合适的翻译了)

从上述的几个例子来看,似乎子类只是用来从父类借用一些定义,以避免重复。但是,当我们考虑到subsumption, 事情就有些不同了。什么是Subsumption呢?请看下面这个例子:

var myCell: InstanceTypeOf(cell) := new cell;

var myReCell: InstanceTypeOf(reCell) := new reCell;

procedure f(x: InstanceTypeOf(cell)) is … end;

再看下面这段代码:

myCell := myReCell;

f(myReCell);

在这两行代码中,头一行把一个InstanceTypeOf(reCell)类型的变量赋值给一个InstanceTypeOf(cell)的变量。而第二行则用InstanceTypeOf(reCell)类型的变量作为参数传递给一个参数类型为InstanceTypeOf(cell)的函数。

这种用法在类似Pascal的语言中是不合法的。而在面向对象的语言中,依据以下的规则,它则是完全正确的用法。该规则通常被叫做subtype polimorphism, 即子类型多态(译者按:其实subtyping应该是OO语言最区别于其它语言的地方了)

如果c’是c的子类,并且o’是c’的一个实例,那么o’也是c的一个实例。

更严格地说:

如果c’是c的子类,并且o’: InstanceTypeOf(c’),那么o’: InstanceTypeOf( c ).

仔细分析上面这条规则,我们可以在InstanceTypeOf的类型之间引入一个满足自反和传递性的子类型关系, 我们用<:符号来表示。(译者按:自反就是说, 对任何a, a 关系 a都成立,比如说,数学里的相等关系就是自反的。而传递性是说,如果a 关系 b, b 关系c, 就能推出a 关系c。 大于,小于等关系都是具备传递性的)

那么上面这条规则可以被拆成两条规则:

1. 对任何a: A, 如果 A <: B, 那么 a: B.

2. InstanceTypeOf(c’) <: InstanceTypeOf(c) 当且仅当 c’是c的子类

第一条规则被叫做Subsumption. 它是判断子类型(注意,是subtype, 不是subclass)的唯一标准。

第二条规则可以叫做subclassing-is-subtyping (子类就是子类型,绕嘴吧?)

一般来说,继承都是和subclassing相关的,所以这条规则也可以叫做:inheritance-is-subtyping (继承就是子类型)

所有的面向对象语言都支持subsumption (可以说,没有subsumption, 就不成为面向对象)。

大部分的基于类的面向对象语言也并不区分subclassing和subtyping. 但是,一些最新的面向对象语言则采取了把subtyping和subclassing分开的方法。也就是说,A是B的子类,但A类的对象却不可以当作B类的对象来使用。(译者按:有点象C++里的私有继承,但内容比它丰富)

时间: 2024-10-24 12:54:14

面向对象语言概论(二)的相关文章

面向对象语言概论(一)

本书是我们上面向对象类型理论的教材.当时上这门课时,心里满不以为然,觉得自己的 C++和OO已经颇有造纸,C++和Java的类型系统不说倒背如流,也是轻车熟路,上这么一门课 不是白拿学分?哈哈! 但一上起来,才发现自己竟如井底之蛙一样.老天,原来就这 么简单的面向对象竟有这么多说道!原来除了C++, Java, 面向对象还有这么多没见过甚至没 想过的东西! 前几章概论,勉强还都搞定了.但后面上到类型系统的建模,subject reduction的证明,就发现自己就象回到了本科时代,这,这,这怎么

面向对象语言概论(四)

四,彻底划清界限(继续分离Subclassing和Subtyping) 在第二节我们讨论了部分分离Subclassing和subtyping的方法,即subclassing-implies-subtyping. 现今的许多面向对象语言,如Java, C#都是采用了这种技术.除此之外,还有一种进一步分离Subclassing和subtyping的方法.这种被称作inheritance-is-not-subtyping的方法通过完全割裂subclassing和subtyping之间的联系而在更大程度

面向对象语言概论(三)

传统的基于类的面向对象语言的一个主要特点就是inheritance, subclassing和subtyping之间的密不可分的联系.很多的面向对象语言的语法,概念,就是从这三者而来的.比如说,通过subclassing, 你可以继承父类的一些方法,而同时你又可以在子类中改写父类的方法.这个改写过的方法,通过subtyping, subsumption, 又可以从一个类型是父类的对象去调用. 但是,inheritance, subclassing, subtyping这三者并不是永远和睦相处的.

连载:面向对象葵花宝典:思想、技巧与实践(2) - 面向对象语言发展历史

Simula  面向对象技术最早是在编程语言Simula中提出的.1967年5月20日,在挪威奥斯陆郊外的小镇莉沙布举行的IFIP TC-2 工作会议上,挪威科学家Ole-Johan Dahl和Kristen Nygaard正式发布了Simula 67语言.Simula 67被认为是最早的面向对象程序设计语言,是面向对象的开山祖师,它引入了所有后来面向对象程序设计语言所遵循的基础概念:对象.类.继承,但它的实现并不是很完整.  Simula虽然最早提出面向对象的概念,但因为其本身复杂,比较难学,

用面向对象语言进行面向过程的编程

问题描述 教研室的项目多为开发MIS,开发过程中采用结构化的开发方法(结构化的分析+结构化的设计),但是编程却采用.Net平台,使用C#语言,C#语言是一种纯的面向对象的语言呀,在定义类的时候,我们程序员都是自己根据自己的感觉去定义.这样会不会有不妥的地方呀? 解决方案 解决方案二:面向对象编程语言,本来就兼容全部面向过程编程方法.它们不是对立的,而是扩展和提升.中学生也可以学弹钢琴,而钢琴师也可以弹钢琴.它们的差别,跟钢琴没有关系.解决方案三:面向对象的语言就不可以结构化编程了?!解决方案四:

汉语——世界上唯一的面向对象语言

声明:除了汉语之外,我只会一点英语和日语.因此说是"唯一"略显夸张,有吸引眼球的嫌疑,请大家原谅.严谨地说,标题应该是"汉语是一种面向对象的高级语言".   在网上看到过很多有关汉语和英语比较的文章,他们写的都很不错,并且列举了大量的事例来证明汉语或者英语是优秀的.不过,我想用计算机软件设计的观点,来理性地分析汉语和英语的优缺点.经过分析,我可以断言:汉语是世界上唯一一种面向对象的高级语言.而以英语为首的其他语言,则属于密码型的索引语言.下面通过问答的方式来解释这种

Objeck Programming Language 2.1.3发布 面向对象语言

Objeck Programming Language是一个具有与Java.C#和Pascal关系功能特性的面向对象的计算机语言.在该语言中,所有http://www.aliyun.com/zixun/aggregation/18278.html">数据类型都被视为对象.语言由一个编译器和一个附带内存管理和JIT编译器的虚拟机组成. Objeck Programming Language 2.1.3该版本主要集中在错误修正和性能提升.增强了类库.包括界面的全面支持,为String类中复制的

Objeck Programming Language 2.0.3发布 面向对象语言

Objeck Programming Language是一个具有与Java.C#和Pascal关系功能特性的面向对象的计算机语言.在这种语言中,所有http://www.aliyun.com/zixun/aggregation/18278.html">数据类型都被视为对象.语言由一个编译器和一个附带内存管理和JIT编译器的虚拟机组成. Objeck Programming Language 2.0.3版本修复了一个导致VM损坏的严重错误.2.0.x的版本,加强代码自动嵌入的方法,还有包括系

谈谈javascript语法里一些难点问题(二)

3)    作用域链相关的问题 作用域链是javascript语言里非常红的概念,很多学习和使用javascript语言的程序员都知道作用域链是理解javascript里很重要的一些概念的关键,这些概念包括this指针,闭包等等,它非常红的另一个重要原因就是作用域链理解起来太难,就算有人真的感觉理解了它,但是碰到很多实际问题时候任然会是丈二和尚摸不到头脑,例如上篇引子里讲到的例子,本篇要讲的主题就是作用域链,再无别的内容,希望看完本文的朋友能有所收获. 讲作用域链首先要从作用域讲起,下面是百度百