我在设计方面遇到了一些问题。也许我认为这一切都错了,但似乎我设计的只能以程序的方式运作良好。
我正在开发一款游戏,这个游戏里面有大约10-20名玩家,包括3轮。当玩家启动游戏时,服务器从数据库加载数据,将其存储在java类中,并将请求的数据发送给客户端。让我们称之为Player.java
。这个课程在游戏轮次之间持续存在
游戏中的每个玩家也都有角色。此角色在每轮之间发生变化,我需要以某种方式将此角色与Player.java
相关联。现在我有3个角色:猎人,搜索者和观众。每个角色都有相同的基本内容:onDeath()
,onRespawn()
,onKill(KillEvent event)
。我还需要能够轻松检查玩家的角色。 (例如,将角色与枚举链接起来)。
我现在遇到的问题是如何以OOP方式实现?最初,我将每个角色都作为实现Role.java
的类,每次创建角色时,构造函数中都需要Player
。直到我开始在轮次中间和每轮结束后改变人们的角色之前,这一切都很好。如果我一直将玩家角色设置为新对象,那对我来说似乎是不好的做法。
总结一下(因为我在描述事情时很糟糕),似乎所有这些都能以程序的方式完美地运作,但我无法弄清楚我的生活是实现这个概念的好方法使用OOP。我现在实现它的方式,每个Player
都有一个枚举,说明它们是什么角色,并且要更改该角色,我只需更改Player
中的枚举。尽管如此,一旦我进入游戏逻辑,我最终会得到一个嵌套if语句的TON,我认为可以通过一些多态来大大减少。
因此,以一个问题结束,以面向对象的方式实现此(或该系统的略微修改版本)的良好攻击计划,而不必始终创建从旧对象接收数据的新对象? (我对OOP没有太多经验,但对我来说这似乎是一个坏主意)
答案 0 :(得分:2)
我想我会选择这个解决方案:
Player
成为界面ConcretePlayer
setRole
方法,将角色转为ConcretePlayer
。Role
实施Player
Role
的子类,每个子类在其构造函数中都使用ConcretePlayer
。ConcretePlayer
Player
或ConcretePlayer
访问所有内容。它没有完美的充实,但我认为你明白了。您可能会发现Role
和Player
不应该共享相同的接口,或者您想为回调创建自己的接口,但这取决于您的其余代码和用例。