Ответ 1
Я не уверен, что вы можете комбинировать методы приема, поскольку это потребует вызова супер супер для получения метода ServiceRegistration
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
к каждому смешанному признаку.
trait IgnoreAll extends Actor {
def receive: Receive = Map()
}
trait ServerLocatorTrait extends Actor {
abstract override def receive = ({
case "s" => println("I'm server ")
}: Receive) orElse super.receive
}
trait ServiceRegistrationTrait extends Actor {
abstract override def receive = ({
case "r" => println("I'm registration ")
}: Receive) orElse super.receive
}
class FinalActor extends IgnoreAll with ServiceRegistrationTrait with ServerLocatorTrait
Последнее решение выглядит довольно уродливо для меня.
Для более подробного обсуждения темы см. приведенную ниже ссылку:
Расширение участников с использованием цепочки PartialFunction