打印Writer和继承

时间:2013-07-27 20:18:08

标签: java inheritance

我正在制作一个像视频租赁店一样运作的程序。我有两个课程,DVD和游戏,游戏扩展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处的项目是否是游戏实例,然后获取系统名称,但是崩溃并且非常难以烧毁。

感谢任何帮助,谢谢!

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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

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