2009-04-09 57 views
3

我对Java很陌生。在阅读了一些有关路径搜索的信息之后,我读了关于使用空类作为“interface”,以了解未知对象类型的信息。这是使用java关键字“interface”的正确位置吗?

我正在开发一个基于医院主题的Java游戏。到目前为止,用户可以建立一个接待台和一个GP办公室。它们是两种不同类型的对象,一个是Building,另一个是ReceptionDesk。 (在我的类结构)

我的阶级结构是这样的:

GridObject-->Building 
GridObject-->Item-->usableItem-->ReceptionDesk. 

问题是当可用的项目可以旋转和建筑不能。鼠标点击事件在网格上,因此调用相同的方法。 GP的办公室是Building,前台是ReceptionDesk。只有ReceptionDesk的方法rotate。当电网右击,如果在建设模式,我都用这个“如果”声明:

if (currentBuilding.getClass.equals(ReceptionDesk.getClass) 

我则必须创建一个新的ReceptionDesk,使用rotate方法,并把该 前台回到currentBuilding GridObject

我不确定我是否很好地解答了我自己的问题。抱歉。我对Java仍然很陌生。我会尽力回答任何问题,如果需要的话,我可以发布更多代码snippits。我不知道可能有办法解决不了解对象类的问题,但是我也可能会以错误的方式解决这个问题。

我没有计划在这方面进行调查,直到我看到这个网站上的回复有多快和有帮助! :)

在此先感谢。

相对

回答

7

你不想在你的情况做有它的东西之前检查类的一个对象。你应该使用polymorphism。你想让接口定义一些方法。每个类都实现这些方法。通过接口引用该对象,并让这些对象的各个实现将其值返回给调用者。

如果您再描述一些您认为需要的对象,这里的人们会对您应该如何布置它们提出意见。但是从您提供的内容来看,您可能需要一个定义一些常规方法的“构建”接口。你也可能想要一个“UsableItem”接口或更通用的东西。医院可能是一个实施建筑的班级。 ReceptionDesk可以实现UsableItem。建筑物内部可以有一个UsableItem的网格。

如果rotate()是所有实际做过某些工作的家具的常用方法,那么可以考虑制作一个AbstractUsableItem类,该类是实现UsableItemand并提供rotate()方法的抽象类。如果每个实现类中的rotate都不相同,那么您可以在界面中使用该方法,但每个类(如ReceptionDesk)都会使用rotate()方法执行自己的操作。您的代码会做这样的事情:

UsableItem desk = new ReceptionDesk(); 
desk.rotate() 

在你的榜样,如果屏幕上的鼠标点击旋转的对象下它,你真的需要检查,看看是否对象可以做这样的事情之前,旋转那你会做

if (clickedObject instanceOf UsableItem) { 
    ((UsableItem) clickedObject).rotate(); 
} 

其中UsableItem是接口或抽象类。有些人认为所有的设计都应该通过界面合同来完成,并为每一类课程提供一个界面,但是我不知道你是否必须走这么远。

+0

感谢这个有用的答案和信息。在我完全理解它之前,我将不得不更多地阅读它,虽然从你将它链接到的例子来看,这看起来像我应该在这里做的事情的正确方式。 – Relequestual 2009-04-10 16:30:27

+0

我已阅读更多内容,请阅读您提供的链接以及该网站上的链接。良好的资源。这是我以前的答案,虽然它确实假设我明白抽象和接口是什么,我没有,但我想这是一个公平的假设。 – Relequestual 2009-04-11 16:02:56

3

您可能会考虑朝完全不同的方向前进,并让对象自己决定采取何种行动。例如,GridObject接口可以为handleRightClick(),handleLeftClick()等指定函数声明。在这种情况下你会说的是“任何自称为GridObject的类需要指定右键单击时发生的事情”。

所以,在Building类中,你可能会实现handleRightClick什么都不做(或者返回一个错误)。在ReceptionDesk类中,您可以实现handleRightClick旋转桌面。然后

您的代码段会成为:

currentBuilding.handleRightClick(... any necessary parameters ...); 
+0

这看起来像我正在寻找的东西!卓见!我相信约翰的回答非常好,但它可能只是在我头上。 我将不得不在GridObject类中具有相同的方法,并使其为空,同时让其他类中的方法名称相同。 – Relequestual 2009-04-10 10:05:08

1

你是正确的担心不无道理。面向对象设计的一个好的经验法则是,无论何时使用像if(x instanceof Y)if(x.getClass().equals(Y.class))这样的结构,您都应该开始考虑向上或向下移动方法或提取新方法。

艾略特和约翰都在不同的方向上提出了很好的想法,你可以去,但他们都是对的,你应该肯定会朝某个方向前进。面向对象的设计可以帮助你的代码变得更清晰,通过为不同类型的行为分支更隐含。检查你在看什么类型的对象,并根据它来决定要做什么,可能会破坏使用面向对象设计的目的。

我也应该警告你,一个接口不完全是一个空类。空抽象类与抽象方法和接口之间存在一些显着差异。不要将接口看作空的类,可以将接口看作是一个契约。通过实现一个接口,你的类承诺提供界面中列出的每一种方法。