我正在开发一个类似于视频租赁商店的程序。我有两个类,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/