我写了一个Akka基本角色,可以处理一些常见消息。我想通过扩展基本角色(而不是通过基本角色的组成)在子角色中重用此基本行为。
在前面的问题中,我已经看到了几种方法。它们都是有效的,但也可以改进:
和
为了使实现更整洁,我正在尝试实现以下目标:
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")
}
}
以下是我可以创建子角色实例的两种替代方法,该实例将常见行为和其他行为结合在一起:
//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令人着迷的是,此框架的设计人员认为没有必要使此通用要求易于实现。
我想只要您不尝试使用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] 删除。
我来说两句