我对Java很新。在阅读了一些关于路径查找的信息之后,我读到了对于未知对象类型使用空类作为“interface
”。
我正在开发一个基于医院主题的Java游戏。到目前为止,用户可以建立一个接待台和一个GP的办公室。它们是两种不同类型的对象,一种是Building
,另一种是ReceptionDesk
。 (在我的班级结构中。)
我的班级结构是:
GridObject-->Building
GridObject-->Item-->usableItem-->ReceptionDesk.
当可用项目可以旋转而建筑物无法旋转时,问题就出现了。鼠标单击事件位于网格上,因此调用相同的方法。 GP的办公室是Building
,前台是ReceptionDesk
。只有ReceptionDesk
的方法为rotate
。右键单击网格时,如果处于构建模式,我必须使用此“if”语句:
if (currentBuilding.getClass.equals(ReceptionDesk.getClass)
然后我必须创建一个新的ReceptionDesk
,使用rotate
方法和put
接待处回到currentBuilding GridObject
。
我不确定我是否正好用这个问题解释自己。抱歉。我还是Java新手。我将尝试回答任何问题,如果需要,我可以发布更多代码snippits。我不知道可能有一种方法可以解决不知道对象类的问题,但是我也可能采用错误的方式。
在我看到这个网站上的回复有多快和有帮助之前,我没有计划对此进行调查! :)
提前致谢。
相对
答案 0 :(得分:7)
在您的案例中使用它之前,您不希望检查对象的类。您应该使用polymorphism。您希望让Interface定义一些方法。每个类都实现这些方法。通过其接口引用对象,并让这些对象的各个实现将其值返回给调用者。
如果你描述了一些你认为需要的对象,那么这里的人们就会对你如何解决它们提出意见。但是根据您提供的内容,您可能需要一个“构建”界面来定义一些常规方法。您可能还需要“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是接口或抽象类。有些人认为所有的设计都应该通过接口合同来完成,并建议每种类型的接口,但我不知道你是否必须走这么远。
答案 1 :(得分:3)
你可能会考虑朝着完全不同的方向前进,让对象自己决定采取什么样的行动。例如,GridObject接口可能为handleRightClick(),handleLeftClick()等指定函数声明。在这种情况下,您要说的是“任何自称为GridObject的类都需要指定右键单击时发生的情况”
因此,在Building类中,您可以实现handleRightClick不执行任何操作(或返回错误)。在ReceptionDesk类中,您可以实现handleRightClick来旋转桌面。
您的代码段将变为:
currentBuilding.handleRightClick(... any necessary parameters ...);
答案 2 :(得分:1)
你担心是对的。面向对象设计的一个好的经验法则是,无论何时使用if(x instanceof Y)
或if(x.getClass().equals(Y.class))
等构造,都应该开始考虑向上或向下移动方法,或者提取新方法。
我还应该警告你,接口不是一个空类。空抽象类与抽象方法和接口之间存在一些显着差异。不要将接口视为空类,而应将接口视为契约。通过实现接口,您的类承诺提供接口中列出的每种方法。