我目前正在Scala开发一个游戏,我有许多实体(例如GunBattery,Squadron,EnemyShip,EnemyFighter),它们都是从GameEntity类继承的.游戏实体通过事件/消息系统向游戏世界和彼此广播感兴趣的事物.有许多EventMesssages(EntityDied,FireAtPosition,HullBreach).
目前,每个实体receive(msg:EventMessage)对其响应的每种消息类型具有更具体的接收方法(例如receive(msg:EntityDiedMessage)).一般receive(msg:EventMessage)方法只是一个switch语句,它根据消息类型调用适当的receive方法.
随着游戏的开发,实体和消息列表(以及哪些实体将响应哪些消息)是流动的.理想情况下,如果我希望游戏实体能够接收新的消息类型,我只希望能够为响应编写逻辑代码,而不是那样做,并且必须更新匹配语句.
我认为有一种想法是将接收方法从游戏实体层次结构中拉出来,并且有一系列函数,比如def receive(e:EnemyShip,m:ExplosionMessage)和def,receive(e:SpaceStation,m:ExplosionMessage)但这会使问题复杂化,因为现在我需要一个匹配语句来覆盖消息和游戏实体类型.
这似乎与Double和Multiple dispatch 的概念有关,也许与Visitor模式有关,但我在绕着它缠绕时遇到了一些麻烦.我本身并不是在寻找OOP解决方案,但是如果可能的话我想避免反思.
编辑
做一些更多的研究,我认为我正在寻找的是类似Clojure的东西defmulti.
你可以这样做:
(defmulti receive :entity :msgType)
(defmethod receive :fighter :explosion [] "fighter handling explosion message")
(defmethod receive :player-ship :hullbreach [] "player ship handling hull breach")
Run Code Online (Sandbox Code Playgroud)