Scala:如何扩展Akka演员?
我写了一个阿克卡基地的演员,可以处理一些常见的信息。我希望通过扩展基本角色(而不是通过基本角色的组合),在子角色中重用这个基本行为 我在前面的问题中看到了几种方法。它们都是有效的,但也可以改进: 及 为了使实现更简洁,我正在尝试实现以下目标:Scala:如何扩展Akka演员?,scala,akka,actor,Scala,Akka,Actor,我写了一个阿克卡基地的演员,可以处理一些常见的信息。我希望通过扩展基本角色(而不是通过基本角色的组合),在子角色中重用这个基本行为 我在前面的问题中看到了几种方法。它们都是有效的,但也可以改进: 及 为了使实现更简洁,我正在尝试实现以下目标: 定义子参与者时,我尝试只扩展基本参与者(而不是同时扩展actor和sub-actor)。但是,我无法强制编译器执行此操作 我还尝试不重命名receivepartial函数,因为这是一种约定 以下是我的实现示例: //This is the base
- 定义子参与者时,我尝试只扩展基本参与者(而不是同时扩展
和actor
)。但是,我无法强制编译器执行此操作sub-actor
- 我还尝试不重命名
partial函数,因为这是一种约定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"
这里有两种可选方法,我可以创建子参与者的实例,它结合了常见行为和其他行为:
//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"
最后,我可以通过以下方式调用子参与者:
//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"
我的实现存在问题:
//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"
当我创建子actor的实例时,只有这样,我才能直接(1)或通过定义一个新类来混合基本actor
正如我之前所说的,当我定义子角色时,我更喜欢混合基本角色。当我尝试创建子参与者的实例时,情况就不是这样了
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")
}
}
此框架的设计者已经在
Actor
中创建了未处理的方法-您只需重写它就足够了it@ghik我不明白你的一行程序。它能编译吗?我想你的意思是未处理(message:Any):Unit={message match{…}
也不需要覆盖def receive
。另外,正如您所说,receive
将覆盖基本actor中未处理的。这样做是有道理的。这是一个很好的解决办法。谢谢你。@rapt-oops,我太笨了。是的,关于那场比赛你是对的。我将编辑答案以反映这一点。