Implementé un rasgo Listenable/Listener que se puede agregar a Actores. Me pregunto si es posible adjuntar este estilo de rasgo a un actor sin tener que llamar explícitamente al método listenerHandler?Composing actors
También esperaba encontrar esta funcionalidad en la biblioteca de Akka. ¿Me estoy perdiendo algo o hay alguna razón por la cual Akka no incluiría esto?
trait Listenable { this: Actor =>
private var listeners: List[Actor] = Nil
protected def listenerHandler: PartialFunction[Any, Unit] = {
case AddListener(who) => listeners = who :: listeners
}
protected def notifyListeners(event: Any) = {
listeners.foreach(_.send(event))
}
}
class SomeActor extends Actor with Listenable
{
def receive = listenerHandler orElse {
case Start => notifyListeners(Started())
case Stop => notifyListeners(Stopped())
}
}
Pues esta es la cosa, en ambas situaciones que tendría que recordar llamar EIT su super.receive o * listenerHanlder *. Me preguntaba si había un mecanismo en Scala en general o cualquiera de las bibliotecas Actor que permitiera al actor que implementaba Listenable no tener que hacer nada excepto decir: * con Listenable * –
Pero solo tendrías que decir 'extends ListenableActor' en lugar de 'extiende Actor'; dentro de 'ListenableActor' ya habrías anulado' receive' (y, presumiblemente, 'receiveWithin'). Ver también la respuesta de Daniel. –