Вы можете использовать super[T]
для ссылки на членов определенных суперклассов / черт.
Например:
trait IntActor extends Actor {
def receive = {
case i: Int => println("Int!")
}
}
trait StringActor extends Actor {
def receive = {
case s: String => println("String!")
}
}
class IntOrString extends Actor with IntActor with StringActor {
override def receive = super[IntActor].receive orElse super[StringActor].receive
}
val a = actorOf[IntOrString].start
a ! 5 //prints Int!
a ! "Hello" //prints String!
Редактировать:
В ответ на комментарий Хьюго, вот решение, которое позволяет вам составлять миксины без необходимости вручную соединять их приемы вместе.По сути, он включает базовую черту с изменяемым List[Receive]
, и каждая смешанная черта вызывает метод для добавления своего собственного получения в список.
trait ComposableActor extends Actor {
private var receives: List[Receive] = List()
protected def registerReceive(receive: Receive) {
receives = receive :: receives
}
def receive = receives reduce {_ orElse _}
}
trait IntActor extends ComposableActor {
registerReceive {
case i: Int => println("Int!")
}
}
trait StringActor extends ComposableActor {
registerReceive {
case s: String => println("String!")
}
}
val a = actorOf(new ComposableActor with IntActor with StringActor).start
a ! 5 //prints Int!
a ! "test" //prints String!
Единственное, что нужно иметь в виду, это то, чтопорядок получения не должен быть важным, так как вы не сможете легко предсказать, какой из них будет первым в цепочке, хотя вы можете решить это с помощью изменяемой хэш-карты вместо списка.