小编Mic*_*ael的帖子

如何在不使用switch语句的情况下基于两个对象的类型在Scala/Java中调用正确的方法?

我目前正在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)但这会使问题复杂化,因为现在我需要一个匹配语句来覆盖消息游戏实体类型.

这似乎与DoubleMultiple 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)

scala double-dispatch

9
推荐指数
1
解决办法
1787
查看次数

标签 统计

double-dispatch ×1

scala ×1