1

我正在开发一个小型 java 游戏,它是 1995 年游戏主题医院的一种克隆。我最近一直在研究 GUI 和关卡结构,现在我可以找到路径和网格了。我目前“建造东西”的方式包括一个房间和一个接待台,到目前为止它工作正常,但我需要实现一种方法来添加不同类型的房间和项目。这是我当前在按钮上创建对象的代码(http://snipt.org/lUm)。

我相信一定有更好的方法来做到这一点!我知道我的实现很差,但我最近才开始了解如何使用抽象类和接口。

实际上设置房间或项目的属性,我目前没有问题。我正在考虑未来,但我喜欢我如何在 Stack 上获得不同的意见。关于如何实现这样的事情的想法?有这类事情的例子吗?我会搜索它,但我不确定要搜索什么,因为如果我正在做的事情有一个确切的名称,我就不知道。

很抱歉,如果我不太清楚我在说什么。我很乐意回答任何进一步的问题,或者根据需要或要求上传更多的代码部分。

提前感谢您的时间和想法!

4

4 回答 4

3

查看工厂模式。工厂是一种通过提供参数来创建对象的方法,并获取符合公共接口的对象。但是,实施由工厂决定。调用代码不需要知道这一点。

通过将对象构造封装在另一个对象(工厂)中,选择要构建的特定对象的机制从调用代码中抽象出来。以后只需修改工厂本身,您就可以轻松地提供更多的子类。

因此,在您的示例代码中,该buildMe()方法是工厂的一种形式。它需要一些参数来指定需要构建的内容 - aRoom或 a ReceptionDesk。两者都将实现相同的接口(a HospitalComponent?),然后调用代码将该组件放置在医院内。您可以将 HospitalComponent 的更多子类添加到工厂(一个OperatingTheatre?),并且调用代码不必更改。

值得研究设计模式(在这种情况下,请查看此创建模式列表)以了解使用对象解决常见问题的不同方式,以及如何与其他人交流您的解决方案。四人帮是这个主题的圣经。

于 2009-08-02T21:50:30.007 回答
1

对于您正在做的事情,多态性可能是矫枉过正。

就个人而言,我只会有一个 Room 类,其中包含每个建筑物的值表(最大尺寸、每块瓷砖的成本等)。然后,当您构建一个新房间时,获取匹配的表格条目,并使用表格中的详细信息创建您的房间对象。

这可能不是最佳实践,并且可能违反 Java 约定(我从动态语言来到 Java),但就需要更改以创建新房间的代码行而言,它是我发现的最低的。

于 2009-08-02T21:52:04.103 回答
0

您现在拥有的是一个具有一堆静态函数的类。这不是非常面向对象的——该类只是将所有函数分组到一个文件中的一种方式。

如果你走 OOP 路线,你会想要一个 Room 基类,然后 OperatingRoom、ReceptionistDesk、Bathroom、Office (for Staff)、MRIRoom、WaitingRoom,甚至可能 Hall 都是 Room 的子类。

public class Room {
    protected int width, length;  //how many squares wide/long the room is

    protected int x, y;  //where it is on the gride

    protected float buildingProgress;  //how far construction has come

    protected bool isReady;  //is the building ready for use?

    protected Person occupants[];  //some list/array of people currently in the room

    protected Person resident;  //the person 'in charge' in the room--the receptionist, manager, MRI technician, etc etc.
}
于 2009-08-02T22:16:05.263 回答
0

在用多态性建模这个问题之前,我会仔细考虑。

问题是:每种类型的 Room 会表现出哪些根本不同的行为?他们之间有什么共同点?

多态性并不总是答案。组合有时可以使事情变得更加灵活。如前所述,数据驱动的解决方案可能是最好的。

于 2009-08-03T00:59:52.190 回答