我写了一个可以处理一些常见消息的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
和sub-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。令人着迷的是,这个框架的设计者认为没有必要使这个常见要求易于实现。
答案 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")
}
}