【问题标题】:How should i "build" things now I've implemented polymorphism? (Java, sim game)现在我已经实现了多态性,我应该如何“构建”东西? (Java,模拟游戏)
【发布时间】:2010-11-16 05:41:57
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 这种东西对于练习 OOP 和规划你的结构绝对是好的。考虑所有房间的共同点并拥有一个基本房间等级,然后为不同的房间扩展新功能。顺便说一句,我喜欢主题医院 =)
  • 我有一个基本的 GridObject 类,后跟一个 Items 类和 UsableItems 类。只是想弄清楚房间的类型以及如何构建它们
  • 现在使用工厂模式!似乎像魅力一样工作!谢谢
  • 若干年后,我尝试再次使用 Swift 为 ios 制作这款游戏​​。这次我使用的是实体组件系统。不同的做法! =]

标签: java switch-statement simulator


【解决方案1】:

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

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

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

值得研究design patterns(在这种情况下,查看creational patterns 的列表)以了解使用对象解决常见问题的不同方式,以及如何与其他人交流您的解决方案。 Gang-of-Four 这本书是这个主题的圣经。

【讨论】:

  • 这看起来很有趣。当我能睁大两只眼睛时,我将不得不阅读它! :)
  • 哼。查看工厂模式的第一个链接上的 java 示例,这看起来与我需要做的完全一样。打算再将问题保持开放几天,看看是否有人还有其他要说的。不过,这似乎确实是答案。
  • 虽然在查看示例时突然这样做,而不是检查价格等级,对于房间,其中一种方法是 canEnter,以检查一个人是否可以进入: ) 哇!
  • 是的——如果你的类抽象和多态是正确的,你应该很少需要明确地检查类类型。
  • 我需要检查一个人何时必须去某种类型的房间,因为所有房间都存储在一个数组中以便于处理。我相信我只需要检查它是否是一个类的实例。如果我错了,请说出来。
【解决方案2】:

对于你正在做的事情来说,多态性可能是多余的。

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

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

【讨论】:

  • 我考虑过这个。我一直在思考的一件事是我是否需要为每个项目和/或房间设置一个类,我想是的,因为有些方法有其他人没有的方法,尽管我仍然不确定。你说的LOC是什么意思?我对编程还是很陌生:)
  • 啊,好的,谢谢。除此之外,我知道我需要一组可以为每个房间建造的物品,我认为这可以用一组数字来完成。任何使用单个“房间”之类的示例,其中包含每种类型的值表?干杯
【解决方案3】:

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

如果你走 OOP 路线,你会想要一个 Room 基类,然后是 OperatingRoom、ReceptionistDesk、Bathroom、Office(供员工使用)、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.
}

【讨论】:

  • 是的,这就是我想要的。我已经为项目和接待处这样做了。 GridObject->Item->UsableItem->ReceptionDesk。前 3 个现在是抽象类。我决定将接待台归类为可用物品,所以它有一个使用点。我还没有开始扩展 Room 类,因为“房间”并没有真正与任何其他房间有所不同。我相信我能够根据需要扩展新课程。我的问题主要是关于我应该如何构建房间,因为我对抽象类的概念不熟悉。
  • 虽然你说的对,但我已经有Room类了。我误解了你在说什么。我没有粘贴 Room 类,因为我的问题集中在如何构建不同的房间和/或关于多态性的项目,这表明我已经对类结构进行了排序。
【解决方案4】:

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

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

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

【讨论】:

  • 确实是这个问题。实际上,我还不确定,但是,我想留出尽可能多的空间来扩展不同房间的不同功能。我选择多态性的原因是因为我之前的问题 (stackoverflow.com/questions/736081/…),但可能是物品而不是房间需要这种情况。我现在能想到的是,房间将允许不同的工作人员进入,不同的内置物品,有些房间会允许很多人,比如厕所
  • 多态和合成是正交的,不是吗?组合与构建对象的方式有关,而多态性与覆盖行为有关。我不确定我是否理解你的最后一段。
  • 你是对的。我才刚刚学会如何使用多态性,所以我还知之甚少。哦,对不起,我的最后一段,我只是在考虑不同房间之间的不同之处,这是从答案的问题开始的。我想我已经在 Room 类中分配了常用的属性和方法
  • @Relequestal - 我在讨论 duffymo 并且“多态性​​并不总是答案。组合有时可以让事情变得更加灵活”......!
  • 啊好的。我的错。是的,我只是假设说了什么让我头疼,因为这是我第一次使用多态性,几天前才知道它的含义!大声笑
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多