这是使用java关键字“interface”的正确位置吗?

时间:2009-04-09 22:13:37

标签: java interface keyword

我对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。我不知道可能有一种方法可以解决不知道对象类的问题,但是我也可能采用错误的方式。

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

提前致谢。

相对

3 个答案:

答案 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))等构造,都应该开始考虑向上或向下移动方法,或者提取新方法。

艾略特和约翰都在你可以走的非常不同的方向上提出了很好的想法,但他们都是正确的,因为你肯定会向某个方向移动。面向对象的设计可以通过使不同类型的行为的分支更加隐含来帮助您的代码变得更加清晰。检查您正在查看的对象类型以及基于此确定要执行的操作可能会破坏使用面向对象设计的目的。

我还应该警告你,接口不是一个空类。空抽象类与抽象方法和接口之间存在一些显着差异。不要将接口视为空类,而应将接口视为契约。通过实现接口,您的类承诺提供接口中列出的每种方法。