我正在创建扩展Actor的多个特征。然后我想创建一个使用其中一些特征的actor类。但是,我不确定如何在Actor类的receive方法中组合所有traits的receive方法。
特质:
trait ServerLocatorTrait extends Actor {
def receive() = {
case "s" => println("I'm server ")
}
}
trait ServiceRegistrationTrait extends Actor {
def receive() = {
case "r" => println("I'm registration ")
}
}
演员:
class FinalActor extends Actor with ServiceRegistrationTrait with ServerLocatorTrait {
override def receive = {
super.receive orElse ??? <--- what to put here
}
}
现在,如果我将"r"
和"s"
发送到FinalActor
,则只会在ServerLocatorTrait
中发送 - 这是最后添加的特征。
所以现在它的工作方式是它认为超级最后添加的特性,所以在这种情况下ServerLocatorTrait
问题:
如何组合FinalActor
中所有特征的接收方法?
PS - 我见过react
示例的演员:http://www.kotancode.com/2011/07/19/traits-multiple-inheritance-and-actors-in-scala/
但这不是我需要的东西
答案 0 :(得分:17)
我不确定你是否可以结合接收方法,因为这将涉及调用super的super以获取ServiceRegistration
的{{1}}方法。这也很混乱。
另一种方法是为特征中的receive
方法指定不同的名称。
receive
您仍然可以使用初始方法,但必须为每个混合特征链接trait ServerLocatorTrait extends Actor {
def handleLocation: Receive = {
case "s" => println("I'm server ")
}
}
trait ServiceRegistrationTrait extends Actor {
def handleRegistration: Receive = {
case "r" => println("I'm registration ")
}
}
class FinalActor extends Actor with ServiceRegistrationTrait with ServerLocatorTrait {
def receive = handleLocation orElse handleRegistration
}
object Main extends App {
val sys = ActorSystem()
val actor = sys.actorOf(Props(new FinalActor))
actor ! "s"
actor ! "r"
sys.shutdown()
}
。
super.receive
后一种解决方案对我来说非常难看。
请参阅以下链接,了解有关该主题的更详细讨论: