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?
为了使实施更简洁,我正在努力实现以下目标:
- 定义子角色时,我尝试只扩展基础角色(而不是
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) 或通过定义一个新的 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")
}
}
我写了一个可以处理一些常见消息的 Akka base-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")
}
}
这里有两种创建子角色实例的替代方法,它结合了常见行为和附加行为:
//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")
}
}