Я реализовал признак Listenable/Listener, который можно добавить в Актеры. Мне интересно, можно ли прикрепить этот стиль признака к актеру без необходимости явного вызова метода listenHandler?Композиционные актеры
Также я ожидал найти эту функциональность в библиотеке Akka. Я что-то упустил или есть какая-то причина, по которой Акка не включил бы это?
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())
}
}
Ну это дело, в обоих случаях я должен помнить, чтобы позвонить еи ее super.receive или * listenerHanlder *. Мне было интересно, существует ли какой-либо механизм в Scala вообще или в любой из библиотек Actor, позволяющий актеру, реализующему Listenable, не делать ничего, кроме как сказать: * с Listenable * –
Но вам нужно было бы только сказать 'extends ListenableActor' вместо 'extends Actor'; внутри 'ListenableActor' вы бы уже переопределили' receive' (и, предположительно, 'receiveWithin'). См. Также ответ Даниила. –