返回介绍

6.7 上溯造型

发布于 2024-10-15 23:56:16 字数 1124 浏览 0 评论 0 收藏 0

继承最值得注意的地方就是它没有为新类提供方法。继承是对新类和基础类之间的关系的一种表达。可这样总结该关系:“新类属于现有类的一种类型”。

这种表达并不仅仅是对继承的一种形象化解释,继承是直接由语言提供支持的。作为一个例子,大家可考虑一个名为 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 句柄的行为叫作“上溯造型”。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文