当前位置:天才代写 > tutorial > JAVA 教程 > java对RTTI的需要

java对RTTI的需要

2017-11-13 08:00 星期一 所属: JAVA 教程 浏览:271

请思量下面这个熟悉的类布局例子,它操作了多形性。通例范例是Shape类,而出格衍生出来的范例是Circle,Square和Triangle。

java对RTTI的需要

这是一个典范的类布局示意图,基本类位于顶部,衍生类向下延展。面向工具编程的根基方针是用大量代码节制基本范例(这里是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句柄引用的精确范例是什么。

 

    关键字:

天才代写-代写联系方式