Java 版画作者与传承

Java 版画作者与传承,java,inheritance,Java,Inheritance,我正在做一个类似视频租赁店的项目。我有两门课,DVD和游戏,游戏扩展了DVD。我正在编写一个保存并加载到文本文件的方法,但遇到了一个我似乎无法理解的小问题 基本上,如果列表中的项目是一个游戏,我需要打印编写器获取游戏所使用的系统类型,并将其打印到文件中。由于链接列表是DVD,我不知道如何进入子类游戏。这是我保存为文本文件的代码(如果列表中的项目是DVD,它可以正常工作) `public void saveAsText(字符串文件名)引发IOException{ { PrintWriter out

我正在做一个类似视频租赁店的项目。我有两门课,DVD和游戏,游戏扩展了DVD。我正在编写一个保存并加载到文本文件的方法,但遇到了一个我似乎无法理解的小问题

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

`public void saveAsText(字符串文件名)引发IOException{
{
PrintWriter out=新的PrintWriter(新的BufferedWriter(
新文件编写器(文件名));
out.println(listDVD.size());
对于(int i=0;i
我尝试添加一些代码来检查索引I中的项目是否是游戏实例,然后获取系统名称,但崩溃和烧坏得很厉害


感谢您的帮助,谢谢

要直接回答您的问题,检测该物品是否真的是游戏,您可以使用以下代码

if (d instanceof Game) {
  Game g = (Game) d;
  // access game functions here
}
…但这往往是不好的Java实践,因为它没有利用您正在设置的多态性。更好的办法是给DVD提供一种方法,比如
writeTo(PrintWriter)
,然后您可以在游戏中重写该方法来编写游戏特定的信息。这样,您就可以让每个DVD子类管理自己的写入流的过程

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

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

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

“崩溃和烧得很厉害”…这是什么意思?想给我们看一下“检查索引i中的项目是否是游戏实例的代码”吗?现在,这可能是因为您的代码片段脱离了上下文,但似乎您在这里有一个无论如何都可能要避免的设计场景-您能否告诉我们
saveAsText(…)
存在于何处,以及
listDVD
实际属于何处?最后,崩溃的堆栈跟踪将是好的。太棒了!的实例的问题是试图找出如何将游戏变量分配给列表中的项目。。。。投吧!至于设计问题,我同意你的看法,但设计是传下来的,我不会改变它。
for (DVD d : listDVD) {
  d.writeTo(out);
}