Ho implementato un tratto Ascolto/Ascolto che può essere aggiunto agli attori. Mi chiedo se sia possibile attribuire questo stile di tratto a un attore senza che debba chiamare esplicitamente il metodo listenerHandler?Compositore
Inoltre, mi aspettavo di trovare questa funzionalità nella libreria di Akka. Mi sto perdendo qualcosa o c'è qualche ragione per cui Akka non lo includerebbe?
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())
}
}
Beh, questa è la cosa, in entrambe le situazioni avrei dovuto ricordarsi di chiamare eit il suo super.receive o * listenerHanlder *. Mi chiedevo se esistesse un meccanismo in Scala in generale o in una qualsiasi delle librerie di attori che permettesse all'attore di implementare Listenable di non dover fare nulla se non dire: * con Listenable * –
Ma dovresti solo dire "estende ListenableActor". invece di "estende l'attore"; all'interno di 'ListenableActor' avresti già sovrascritto' receive' (e, presumibilmente, 'receiveWithin'). Vedi anche la risposta di Daniele. –