之所以叫作这个名字除了有一定的历史原因外也是由于在传统意义上类继承图的画法是根位于最顶部再逐渐向下扩展(当然可根据自己的习惯用任何方法描绘这种图)因素Windjava的继承图就象下面这个样子 由于造型的方向是从衍生类到基础类箭头朝上所以通常把它叫作上溯造型即Upcasting上溯造型肯定是安全的因为我们是从一个更特殊的类型到一个更常规的类型换言之衍生类是基础类的一个超集它可以包含比基础类更多的方法但它至少包含了基础类的方法进行上溯造型的时候类接口可能出现的唯一一个问题是它可能丢失方法而不是赢得这些方法这便是在没有任何明确的造型或者其他特殊标注的情况下编译器为什么允许上溯造型的原因所在 也可以执行下溯造型但这时会面临第章要详细讲述的一种困境 再论合成与继承 在面向对象的程序设计中创建和使用代码最可能采取的一种做法是将数据和方法统一封装到一个类里并且使用那个类的对象有些时候需通过合成技术用现成的类来构造新类而继承是最少见的一种做法因此尽管继承在学习OOP的过程中得到了大量的强调但并不意味着应该尽可能地到处使用它相反使用它时要特别慎重只有在清楚知道继承在所有方法中最有效的前提下才可考虑它为判断自己到底应该选用合成还是继承一个最简单的办法就是考虑是否需要从新类上溯造型回基础类若必须上溯就需要继承但如果不需要上溯造型就应提醒自己防止继承的滥用在下一章里(多形性)会向大家介绍必须进行上溯造型的一种场合但只要记住经常问自己我真的需要上溯造型吗对于合成还是继承的选择就不应该是个太大的问题 |