0

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

基本上,如果列表中的项目是游戏,我需要打印作者获取游戏运行的系统类型并将其打印到文件中。由于链接列表是 DVD,我不确定如何进入子类 Game。这是我保存为文本文件的代码(如果列表中的项目是 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 处的项目是否是游戏实例,然后获取系统名称,但崩溃并烧毁得很厉害。

任何帮助表示赞赏,谢谢!

4

1 回答 1

1

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

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

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

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

旁注2:如果您不需要i遍历列表中的每个项目,则可以使用不同类型的for语法:

for (DVD d : listDVD) {
  d.writeTo(out);
}
于 2013-07-27T20:28:10.057 回答