微网站建设包含,延安网站建设,网站设计网络公司,邢台123招聘信息最新招聘信息网6.7 上溯造型继承最值得注意的地方就是它没有为新类提供方法。继承是对新类和基础类之间的关系的一种表达。可这样总结该关系#xff1a;“新类属于现有类的一种类型”。这种表达并不仅仅是对继承的一种形象化解释#xff0c;继承是直接由语言提供支持的。作为一个例子#…6.7 上溯造型继承最值得注意的地方就是它没有为新类提供方法。继承是对新类和基础类之间的关系的一种表达。可这样总结该关系“新类属于现有类的一种类型”。这种表达并不仅仅是对继承的一种形象化解释继承是直接由语言提供支持的。作为一个例子大家可考虑一个名为Instrument的基础类它用于表示乐器另一个衍生类叫作Wind。由于继承意味着基础类的所有方法亦可在衍生出来的类中使用所以我们发给基础类的任何消息亦可发给衍生类。若Instrument类有一个play()方法则Wind设备也会有这个方法。这意味着我们能肯定地认为一个Wind对象也是Instrument的一种类型。下面这个例子揭示出编译器如何提供对这一概念的支持//: Wind.java// Inheritance upcastingimport 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句柄的行为叫作“上溯造型”。6.7.1 何谓“上溯造型”之所以叫作这个名字除了有一定的历史原因外也是由于在传统意义上类继承图的画法是根位于最顶部再逐渐向下扩展(当然可根据自己的习惯用任何方法描绘这种图)。因素Wind.java的继承图就象下面这个样子由于造型的方向是从衍生类到基础类箭头朝上所以通常把它叫作“上溯造型”即Upcasting。上溯造型肯定是安全的因为我们是从一个更特殊的类型到一个更常规的类型。换言之衍生类是基础类的一个超集。它可以包含比基础类更多的方法但它至少包含了基础类的方法。进行上溯造型的时候类接口可能出现的唯一一个问题是它可能丢失方法而不是赢得这些方法。这便是在没有任何明确的造型或者其他特殊标注的情况下编译器为什么允许上溯造型的原因所在。也可以执行下溯造型但这时会面临第11章要详细讲述的一种困境。再论合成与继承在面向对象的程序设计中创建和使用代码最可能采取的一种做法是将数据和方法统一封装到一个类里并且使用那个类的对象。有些时候需通过“合成”技术用现成的类来构造新类。而继承是最少见的一种做法。因此尽管继承在学习OOP的过程中得到了大量的强调但并不意味着应该尽可能地到处使用它。相反使用它时要特别慎重。只有在清楚知道继承在所有方法中最有效的前提下才可考虑它。为判断自己到底应该选用合成还是继承一个最简单的办法就是考虑是否需要从新类上溯造型回基础类。若必须上溯就需要继承。但如果不需要上溯造型就应提醒自己防止继承的滥用。在下一章里(多形性)会向大家介绍必须进行上溯造型的一种场合。但只要记住经常问自己“我真的需要上溯造型吗”对于合成还是继承的选择就不应该是个太大的问题。