快速业务通道

品味Java子类型多态的魅力 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-23
的类型指明了一个对象的表面。这只是一个表面,不是接口。在类型一致的原则下,我们可以用面向类型的观点,为一个对象依附多个引用。对interface to an object这个短语的理解没有确定的理解。

在类型概念中,the interface to an object refers 引用了面向类型观点的最大可能----如图2的情形。把一个基类的引用指向相同的对象缩小了这样的观点----如图3所示。类型概念能使人获得把对象间的相互作用同实现细节分离的要领。相对于一个对象的接口,面向类型的观点更鼓励人们去使用一个对象的引用。引用类型规定了对象间的相互作用。当你考虑一个对象能做什么的时候,只需搞明白他的类型,而不需要去考虑他的实现细节。

品味Java子类型多态的魅力(7)

时间:2010-09-13

Java接口

以上所谈到的多态行为用到了类的继承关系所建立起来的子类型关系。Java接口同样支持用户定义的类型,相对地,Java的接口机制启动了建立在类型层次结构上的多态行为。假设一个名为ref的引用变量,并使其指向一个包含一下方法的类对象:

public String poly2( IType iType ) {  return iType.m3(); }

为了弄明白poly2(IType)中的多态,以下的代码从不同的类创建两个对象,并分别把他们传给poly2(IType):

Derived2 derived2 = new Derived2(); Separate separate = new Separate(); String tmp; tmp = ref.poly2( derived2 ); // tmp is "Derived.m3()" tmp = ref.poly2( separate ); // tmp is "Separate.m3()"

上面的代码类似于关于poly1(Base)中的多态的讨论。poly2(IType)的实现代码是调用每个对象的本地版本的m3()方法。如同以前,代码的注释表明了每次调用所返回的CString类型的结果。图5表明了两次调用poly2(IType)的概念结构:

品味Java子类型多态的魅力 - 编程入门网

图5:指向Derived2和Separate对象的IType引用

方法poly1(Base)和poly2(IType)中所表现的多态行为的相似之处可以从透视图中直接看出来。把我们在实现在一层上的理解再提高一层,就可以看到这两段代码的技巧。基类的引用指向了作为参数传进的类,并且按照类型的限制调用对象的方法。引用既不知道也不关心执行哪一段代码。编译期间的子类型关系检查保证了通过的对象有能力在被调用的时候选择合适的实现代码。

然而,他们在实现层上有一个重要的差别。在poly1(Base)的例子中(图3和图4),Base-Derived-Derived2的类继承结构为子类型关系的建立提供了条件,并决定了方法去调用哪段代码。在poly2(IType)的例子中(如图5),则是完全不同的动态发生的。Derived2和Separate不共享任何实现的层次,但是他们还是通过IType的引用展示了多态的行为。

这样的多态行为使Java的接口的功能的重大意义显得很明显。图1中的UML类图说明了Derived是Base和IType的子类型。通过完全脱离实现细节的类型的定义方法,Java实现了多类型继承,并且不存在Java所禁止的多继承所带来的烦人的问题。完全脱离实现层次的类可以按照Java接口实现分组。在图1中,接口IType和Derived,Separate以及这类型的其他子类型应该划为一组。

按照这种完全不同于实现层次的分类方法,Java的接口机制是多态变得很方便,哪怕不存在任何共享的实现或者复写的方法。如图5所示,一个IType的引用,用多态的方法访问到了Derived2和Separate对象的m3()方法。

再次探讨对象的接口

注意图5中的Derived2和Separate对象的对m1()的映射方法。如前所述,每一个对象的接口都包含方法m1()。但却没有办法用这两个对象使方法m1()表现出多态的行为。每一个对象占有一个m1()方法是不够的。必须存在一个可以操作m1()方法的类型,通过这个类型可以看到对象。这些对象似乎是共享了m1()方法,但在没有共同基类的条件下,多态是不可能的。通过对象的接口来

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号