斯卡拉:如何扩展阿卡演员?

时间:2017-12-08 19:43:48

标签: scala akka actor

我写了一个可以处理一些常见消息的Akka base-actor。我想通过扩展base-actor(而不是base-actor的组合)在子actor中重用这个基本行为。

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

How extend behaviour of super actor in akka

How do I best share behavior among Akka actors?

为了使实现更清洁,我试图实现以下目标:

  • 在定义子actor时,我尝试只扩展base-actor(不是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")
  }
}

以下是我可以创建子actor实例的两种替代方法,它结合了常见行为和其他行为:

//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"

我的实施问题:

当我创建子actor的实例时,只有这样我才能直接(1)或通过定义一个混合在base-actor中的新类来混合base-actor。

就像我之前说的那样,当我定义子actor时,我宁愿混合使用base-actor。不是在我尝试创建子actor的实例时。

P.S。令人着迷的是,这个框架的设计者认为没有必要使这个常见要求易于实现。

1 个答案:

答案 0 :(得分:1)

我想只要您没有尝试使用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")
  }
}