Scala:如何扩展 As 演员?

Scala: How to extend an Akka actor?

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

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

How extend behaviour of super actor in akka

How do I best share behavior among Akka actors?

为了使实施更简洁,我正在努力实现以下目标:

这是我的实施示例:

//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) 或通过定义一个新的 class 来混入基础角色。

就像我之前说的,我更愿意在定义子角色时混入基本角色。当我尝试创建子角色的实例时不是。

P.S. 令人着迷的是,这个框架的设计者没有看到有必要让这个共同的需求变得容易实现。

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