快速业务通道

面向对象语言概论(三)

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-29
说类型一是类型二的subtype.

由类型名字决定的subtype是这样的:只有当类型一具有了类型二的所有需要具备的属性和方法, 并且类型一被明确声明为类型二的subtype时,我们才认可这种关系。

而如果我们的选择是一,那么那些属性和方法是subtype所必需具备的呢?哪些是可有可无的呢?

由组成结构决定的subtype能够在分布式环境和object persistence系统下进行类型匹配(译者注:对这点,我也不甚明了。看来,纸造得还是不够)。缺点是,如果两个类型碰巧具有了相同的结构,但实际上却风马牛不相及,那就会造成错误。不过,这种错误是可以用一些技术来避免的。

相比之下,基于名字的subtype不容易精确定义,而且也不支持基于结构的subtype.

(译者按,这里,我无论如何和作者找不到同感。基于结构的subtype的缺点是一目了然,不过完美的避免的方法我却看不出来。而基于名字的subtype为什么就不能精确定义呢?C++/Java/C#, 所有流行的OO语言都只支持基于名字的subtype, 也没有发现有什么不够灵活的地方。需要在不同名字但类似结构的类型之间架桥的话,adapter完全可以胜任嘛!)

目前,我们可以先定义一个简单的基于结构的subtype关系:

对两个类型O和O’,

O’ <: O 当 O’ 具有所有O类型的成员。O’可以有多于O的成员。

例如:ReCell <: Cell.

为了简明,这个定义没有考虑到方法的特化。

另外,当类型定义有递归存在的时候(类似于链表的定义),对subtype的定义需要额外地加小心。我们会在第九章及之后章节讲到递归的时候再详细说明。(译者按:第九章啊?饶了我吧!想累死我啊?)

因为我们不关心成员的顺序,这种subtype的定义自动地就支持多重的subtype.

比如说:

ObjectType ReInteger is

var contents: Integer;

var backup: Integer;

method restore();

end;

那么,我们就有如下的subtype的关系:

ReCell <: Cell

ReCell <: ReInteger

(译者按,作者的例子中没有考虑到象interface不能包含数据域这样的细节。实际上,如果我们支持对数据域的override, 而不支持shadowing -- 作者的基于结构的subtype语义确实隐含着这样的逻辑― 那么,interface里包含不包含数据域就无关紧要了,因为令人头疼的名字冲突问题已经不存在了)

从这个定义,我们可以得出:

如果c’是c的子类, 那么ObjectTypeOf(c’) <: ObjectTypeOf(c)

注意,这个定义的逆命题并不成立,也就是说:

即使c’和c之间没有subclass的关系,只要它们所定义的成员符合了我们subtype的定义,ObjectTypeOf(c’) <: ObjectTypeOf(c)仍然成立。

回过头再看看我们在前一章的subclass-is-subtyping:

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

在那个定义中,只有当c’是c的子类时,ObjectTypeOf(c’) <: ObjectTypeOf(c)才能成立。

相比之下,我们已经部分地把subclassing和subtyping分离开了。Subclassing仍然是subtyping, 但subtyping不再一定要求是subclassing了。我们把这种性质叫做“subclassing-implies-subtyping”而不是“subclass-is-subtyping”了。

三,泛型 (Type Parameters)

一般意义上来说,泛型是一种把相同的代码重用在不同的类型上的技术。它作为一个相对独立于其它面向对象特性的技术,在面向对象语言里已经变得越来越普遍了。我们这里之所以讨论泛型,一是因为泛型这种技术本身就很让人感兴趣,另外,也是因为泛型是一个被用来对付二元方法问题 (binary method problem) 的主要工具。

和subtyping共同使用,泛型可以用来解决一些在方法特化等场合由反协变带来的类型系统的困难。考虑这样一个例子:

我们有Perso

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号