Java 混合Akka演员特质与基类冲突

Java 混合Akka演员特质与基类冲突,java,scala,inheritance,akka,jmonkeyengine,Java,Scala,Inheritance,Akka,Jmonkeyengine,我将Akka框架与jMonkeyEngine(jME3)一起用于我的小scala/java游戏。通过修改一些代码,我成功地在与jME3的主循环线程相同的线程中运行了一个专用的actor。为了让参与者能够访问SimpleApplication类的受保护变量,我们应该扩展该类以使用jME3创建游戏,我认为创建一个继承SimpleApplication类并与trait actor混合的类是很好的。大概是这样的: JmeActor extends SimpleApplication with Actor

我将Akka框架与jMonkeyEngine(jME3)一起用于我的小scala/java游戏。通过修改一些代码,我成功地在与jME3的主循环线程相同的线程中运行了一个专用的actor。为了让参与者能够访问SimpleApplication类的受保护变量,我们应该扩展该类以使用jME3创建游戏,我认为创建一个继承SimpleApplication类并与trait actor混合的类是很好的。大概是这样的:

JmeActor extends SimpleApplication with Actor
问题是SimpleApplication和Actor都有一个上下文变量,它们相互冲突。目前,我已将SimpleApplication的上下文变量重命名为jmeContext,并重新编译了jME3。结果很好,但对我来说,设计本身似乎有问题,因为jME3(甚至Akka)的任何进一步发布都需要我再次手动进行重构。开发团队可能会进一步修改SimpleApplication,使这种冲突避免技术变得更加困难,这甚至是可能的,尽管可能性不大


有人能找到一个简单的解决方案吗?

我的直觉表明,将演员实例与游戏引擎的“main”类等丰富类如此紧密地纠缠在一起可能不是一个好的设计选择。我建议子类化
SimpleApplication
,这样您需要的所有功能都可以通过公共方法公开,然后只需在您的actor中保留对该功能的引用;我的猜测是,您希望能够通过向参与者发送消息来影响游戏引擎,从而启用该功能。

我的直觉表明,将参与者实例与游戏引擎的“main”类等丰富类紧密缠绕在一起可能不是一个好的设计选择。我建议子类化
SimpleApplication
,这样您需要的所有功能都可以通过公共方法公开,然后只需在您的actor中保留对该功能的引用;我的猜测是,您希望能够通过向演员发送消息来影响游戏引擎,从而启用该功能。

为什么构图不起作用?您的意思是将演员创建为JmeActor的一个字段,而不是与演员混合?如何设置此参与者的接收函数以访问JmeActor的私有字段?这对您来说可能是微不足道的,但现在我不清楚这一点。不,我的意思是让JMEActor扩展Actor,但有一个包含SimpleApplication的字段。然后参与者获取消息并调用SimpleApplication上的方法。为什么组合不起作用?你的意思是创建一个参与者作为JmeActor的字段,而不是与参与者混合?如何设置此参与者的接收函数以访问JmeActor的私有字段?这对您来说可能是微不足道的,但现在我不清楚这一点。不,我的意思是让JMEActor扩展Actor,但有一个包含SimpleApplication的字段。然后actor接收消息并调用SimpleApplication上的方法。事实上,与actor混合的关键是避免通过公共方法公开受保护的字段,这不仅是因为这是一件非常繁琐的事情,而且因为如果不非常小心,封装会断开。封装在actor中是完美的,不管访问修饰符说什么,因为除了发送消息之外,没有其他代码可以调用actor的方法或访问actor的字段。另一方面,继承让你别无选择。参与者/应用程序的生命周期,必须非常小心SimpleApplication不会暴露于其他线程,这会破坏参与者模型。我认为我的答案可以归结为“jME的设计很糟糕,因为它强制继承”。事实上,与Actor混合的关键是避免通过公共方法公开受保护的字段,这不仅是因为这是一件非常繁琐的事情,而且因为如果不非常小心,封装将被破坏。封装在Actor内部是完美的,不管访问修饰符说什么,因为除了发送消息之外,没有其他代码可以调用actor的方法或访问actor的字段。另一方面,继承让你别无选择。参与者/应用程序的生命周期,必须非常小心SimpleApplication不会暴露于其他线程,这会破坏参与者模型。我想我的答案可以归结为“jME的设计很糟糕,因为它强制继承”。