java - Print Writer 和继承

标签 java inheritance

我正在开发一个类似于视频租赁商店的程序。我有两个类,DVD 和 Game,其中 Game 扩展了 DVD。我正在编写保存和加载到文本文件的方法,但遇到了一些问题,我似乎无法弄清楚。

基本上,如果列表中的项目是游戏,我需要打印编写器获取玩游戏的系统类型并将其打印到文件中。由于链接列表是 DVD,我不确定如何进入子类游戏。这是我保存为文本文件的代码(如果列表中的项目是 DVD,则可以正常工作)

`public void saveAsText(String filename) throws IOException {
    {
        PrintWriter out = new PrintWriter(new BufferedWriter(
                new FileWriter(filename)));
        out.println(listDVD.size());
        for (int i = 0; i < listDVD.size(); i++) {
            DVD d = listDVD.get(i);
            out.println(d.getTitle());
            out.println(d.getNameOfRenter());
            out.println(d.boughtString());
            out.println(d.dBString());



            out.println("");

        }
        out.close();
    }
    }`

我尝试添加一些代码来检查索引 i 处的项目是否是游戏实例,然后获取系统名称,但崩溃并严重烧毁。

感谢任何帮助,谢谢!

最佳答案

要直接回答您的问题,检测该项目是否实际上是游戏,您可以使用这样的代码...

if (d instanceof Game) {
  Game g = (Game) d;
  // access game functions here
}

...但这往往是不好的 Java 实践,因为它没有利用您正在设置的多态性。更好的想法是为 DVD 提供一个方法,例如 writeTo(PrintWriter),然后您可以在 Game 中重写该方法以写入特定于游戏的信息。这样您就可以让每个 DVD 子类管理自己的写入流的过程。

旁注 1: 也许默认情况下将 DVD 视为电影是我的错,但我不会使用 Game 扩展 DVD,因为这假设每个游戏都是一个 DVD,你可以用 DVD 做的所有事情都可以用游戏做。 (game.pause()?)我会让它们都实现一个通用接口(interface)(也许是 RentalItem?),或者如果有代码可以重用,则扩展一个通用抽象类。

旁注 2: 如果除了迭代列表中的每个项目之外不需要 i,则可以使用不同类型的 for 语法改为:

for (DVD d : listDVD) {
  d.writeTo(out);
}

关于java - Print Writer 和继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17902067/

相关文章:

java - 使用 for 循环打印数组元素

Java hibernate如何使用注解映射继承

c++ - 单例混合 C++

java - 如何解析多线程写入的日志?

java - 如何在android中仅以编程方式创建日期文本编辑?

java - 循环播放音频Android Studio

java - WindowBuilder 设计模式未显示我的 Widget 的视觉特征

java - 派生类可以减少对父类(super class)私有(private)方法的限制吗?

java - 继承:对象创建

javascript - 如何在java中使用行分隔2个输出数据