日期:2011-03-22 16:17:00 来源:本站整理
java对RTTI的需求[Java编程]
本文“java对RTTI的需求[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
请考虑下面这个熟习的类构造例子,它操纵了多形性.通例范例是Shape类,而分外衍生出来的范例是Circle,Square和Triangle.
这是一个典型的类构造表示图,底子类位于顶部,衍生类向下延展.面向对象编程的基本目标是用大量代码掌握底子范例(这里是Shape)的句柄,所以假定决意增添一个新类(比方Rhomboid,从Shape衍生),从而对程序举行扩大,那么不会影响到本来的代码.在这个例子中,Shape接口中的动态绑定办法是draw(),所以客户程序员要做的是通过一个普通Shape句柄调用draw().draw()在全部衍生类里城市被覆盖.并且由于它是一个动态绑定办法,所以即便通过一个普通的Shape句柄调用它,也有表现出精确的行为.这恰是多形性的作用.
所以,我们普通成立一个特定的对象(Circle,Square,大概Triangle),把它上溯造型到一个Shape(忽视对象的特别范例),今后便在程序的剩余部份利用匿名Shape句柄.
作为对多形性和上溯造型的一个扼要回想,可以象下面这样为上述例子编码(若履行这个程序时呈现艰难,请参考第3章3.1.2小节“赋值”):
//: Shapes.java package c11; import java.util.*; interface Shape { void draw(); } class Circle implements Shape { public void draw() { System.out.println("Circle.draw()"); } } class Square implements Shape { public void draw() { System.out.println("Square.draw()"); } } class Triangle implements Shape { public void draw() { System.out.println("Triangle.draw()"); } } public class Shapes { public static void main(String[] args) { Vector s = new Vector(); s.addElement(new Circle()); s.addElement(new Square()); s.addElement(new Triangle()); Enumeration e = s.elements(); while(e.hasMoreElements()) ((Shape)e.nextElement()).draw(); } } ///:~
底子类可编码成一个interface(接口)、一个abstract(抽象)类大概一个普通类.由于Shape没有真正的成员(亦即有定义的成员),并且并不在乎我们成立了一个纯粹的Shape对象,所以最合适和最机动的表达方法就是用一个接口.并且由于没必要设置全部那些abstract关键字,所以整个代码也显得更为清爽.
每个衍生类都覆盖了底子类draw办法,所以具有差别的行为.在main()中成立了特定范例的Shape,然后将其增添到一个Vector.这里恰是上溯造型发生的地方,因为Vector只包容了对象.由于Java中的全部东西(除基本数据范例外)都是对象,所以Vector也能包容Shape对象.但在上溯造型至Object的历程中,任何特别的信息城市丧失,此中乃至包含对象是多少形状这一事实.对Vector来说,它们只是Object.
用nextElement()将一个元素从Vector提取出来的时刻,情形变得略微有些复杂.由于Vector只包容Object,所以nextElement()会自然地产生一个Object句柄.但我们知道它实际是个Shape句柄,并且但愿将Shape消息发给那个对象.所以需求用传统的"(Shape)"方法造型成一个Shape.这是RTTI最基本的情势,因为在Java中,全部造型城市在运行期间得到查抄,以确保其精确性.那恰是RTTI的意义所在:在运行期,对象的范例会得到断定.
在目前这种情形下,RTTI造型只实现了一部份:Object造型成Shape,而不是造型成Circle,Square大概Triangle.那是由于我们目前可以必定的唯一事实就是Vector里充斥着多少形状,而不知它们的具体类别.在编译期间,我们必定的根据是我们自己的法则;而在编译期间,倒是通过造型来必定这一点.
目前的局面会由多形性掌握,并且会为Shape调用得当的办法,以便判断句柄毕竟是供应Circle,Square,还是供应应Triangle.并且在普通情形下,必须保证采取多形性筹划.因为我们但愿自己的代码尽大概少知道一些与对象的具体范例有关的情形,只将注意力放在某一类对象(这里是Shape)的通例信息上.只有这样,我们的代码才更易实现、理解以及改正.所以说多形性是面向对象程序计划的一个通例目标.
但是,若碰到一个特别的程序计划问题,只有在知道通例句柄的切当范例后,才能最简单地办理这个问题,这个时刻又该怎么办呢?举个例子来说,我们有时刻想让自己的用户将某一具体范例的多少形状(如三角形)全都变成紫色,以便突出显示它们,并快速找出这一范例的全部形状.此时便要用到RTTI技术,用它查询某个Shape句柄引用的精确范例是什么.
以上是“java对RTTI的需求[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |
评论内容只代表网友观点,与本站立场无关!
评论摘要(共 0 条,得分 0 分,平均 0 分)
查看完整评论