java的上溯造型
担任最值得留意的处所就是它没有为新类提供要领。担任是对新类和基本类之间的干系的一种表达。可这样总结该干系:“新类属于现有类的一种范例”。
这种表达并不只仅是对担任的一种形象化表明,担任是直接由语言提供支持的。作为一个例子,各人可思量一个名为Instrument的基本类,它用于暗示乐器;另一个衍生类叫作Wind。由于担任意味着基本类的所有要领亦可在衍生出来的类中利用,所以我们发给基本类的任何动静亦可发给衍生类。若Instrument类有一个play()要领,则Wind设备也会有这个要领。这意味着我们能必定地认为一个Wind工具也是Instrument的一种范例。下面这个例子展现出编译器如何提供对这一观念的支持:
//: Wind.java // Inheritance & upcasting import java.util.*; class Instrument { public void play() {} static void tune(Instrument i) { // ... i.play(); } } // Wind objects are instruments // because they have the same interface: class Wind extends Instrument { public static void main(String[] args) { Wind flute = new Wind(); Instrument.tune(flute); // Upcasting } } ///:~
这个例子中最有趣的无疑是tune()要领,它能接管一个Instrument句柄。但在Wind.main()中,tune()要领是通过为其赋予一个Wind句柄来挪用的。由于Java对范例查抄出格严格,所以各人大概会感想很奇怪,为什么吸收一种范例的要领也能吸收另一种范例呢?可是,我们必然要认识到一个Wind工具也是一个Instrument工具。并且对付不在Wind中的一个Instrument(乐器),没有要领可以由tune()挪用。在tune()中,代码合用于Instrument以及从Instrument衍生出来的任何对象。在这里,我们将从一个Wind句柄转换成一个Instrument句柄的行为叫作“上溯造型”。