运行时类型信息使得你可以在程序运行时发现和使用类型信息。
1. 为什么需要RTTI
看一个很熟悉的例子,它使用了多态的类层次结构。最通用的类型(泛型)是基类Shape,而派生出的具体类有Circle、Square和Triangle。
这是一个典型的类层次结构图,基类位于顶部,派生类向下扩展。面向对象编程中最基本的目的是:让代码只操作对基类(这里是Shape)的引用。这样如果要添加一个新类来扩展程序,就不会影响到原来的代码。在这个例子的Shape接口中动态绑定了draw()方法,目的就是让客户端程序员使用泛化的Shape引用来调用draw()。draw()在所有派生类里都会被覆盖,并且由于它是被动态绑定的,所以即使是通过泛化的Shape引用来调用,也能产生正确的行为。这就是多态。
因此,通常会创建一个具体对象(Circle,Square,或者Triangle),把它向上转型成Shape,并在后面的程序中使用匿名的Shape引用。可以像下面这样对Shape层次结构编码:
abstract class Shape {
void draw() { System.out.println(this + ".draw()"); }
abstract public String toString();
}
class Circle extends Shape {
public String toString() { return "Circle"; }
}
class Square extends Shape {
public String toString() { return "Square"; }
}
class Triangle extends Shape {
public String toString() { return "Triangle"; }
}
public class Shapes {
public static void main(String[] args) {
List<Shape> shapeList = Arrays.asList(
new Circle(), new Square(), new Triangle()
);
for(Shape shape : shapeList)
shape.draw();
}
} /* Output:
Circle.draw()
Square.draw()
Triangle.draw()
*/
未完。。。。后续整理