Scala:如何扩展Akka演员?

全神贯注

我写了一个Akka基本角色,可以处理一些常见消息。我想通过扩展基本角色(而不是通过基本角色的组成)在子角色中重用此基本行为。

在前面的问题中,我已经看到了几种方法。它们都是有效的,但也可以改进:

如何在Akka中扩展超级演员的行为

我如何最好地在Akka演员之间分享行为?

为了使实现更整洁,我正在尝试实现以下目标:

  • 在定义子角色时,我尝试仅扩展基本角色(而不是Actorsub-actor)。但是,我无法强制编译器执行此操作。
  • 我也尝试不重命名receive部分函数,​​因为这是一种约定。

这是我的实现示例:

//This is the base-actor that implements the common behavior

trait BetterActor extends Actor {

  abstract override def receive = {
    super.receive orElse { case _ => println("Missing pattern!") }
  }
}

//This is the actor that implements the additional behavior.
//I actually wanted to extend BetterActor. It was not possible.

class MyActor extends Actor {

  def receive = {
    case i: Int =>
      println(s"Yay!!! Got $i")
  }
}

以下是我可以创建子角色实例的两种替代方法,该实例将常见行为和其他行为结合在一起:

//1.

val myBetterActor = system.actorOf(Props(new MyActor with BetterActor), "myBetterActor")

//2.

class MyBetterActor extends MyActor with BetterActor
val myBetterActor = system.actorOf(Props[MyBetterActor], "myBetterActor")

最后,我可以通过以下方式调用子角色:

myBetterActor ! 2
myBetterActor ! "a"

我的实施存在问题:

当我创建子角色的实例时,只有这样我才能直接(1)或通过定义一个新的类来混合基本角色,以混合基本角色。

就像我之前说过的,当我定义子角色时,我更喜欢混入基本角色。当我尝试创建子actor的实例时没有。

PS令人着迷的是,此框架的设计人员认为没有必要使此通用要求易于实现。

Mizerlou

我想只要您不尝试使用BetterActor覆盖行为,就可以尝试执行以下操作:

trait BetterActor extends Actor {
  override def unhandled(message: Any): Unit = message match {
    case e: CommonMessage => println("COMMON!")
    case e => super.unhandled(e)
  }
}

class MyActor extends BetterActor {
  override def receive = {
    case i: Int => println(s"Yay!!! Got $i")
  }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章