题
我已经实现了可以添加到演员的可听/侦听器特征。我想知道是否可以将这种特质风格附加到演员,而无需明确调用 听众Handler 方法?
我也希望在Akka库中找到此功能。我是否缺少某些东西,或者有一些理由不包含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())
}
}
解决方案
为什么不扩展 Actor
直接,或者,如果您也希望非演员也可以听,请创建一个可听演员的聆听反应器?
然后你会覆盖 receive
在演员中,就像您上面所做的那样(除非您想打电话 super.receive
另外,不是吗? - 您只想修改传递的功能)。
其他提示
我建议您扩展演员并使用 abstract override
.
为什么我以前没看过这个问题,嗯,迟到总比没有好:
这是一个解决方案(从开始scala中的示例的修改版本):
import se.scalablesolutions.akka.actor.Actor
case class AddListener(who: Actor)
case class RemoveListener(who: Actor)
class ListenableActor extends Actor {
private var listeners: List[Actor] = Nil
def receive = {
case AddListener(who) => listeners ::= who
case RemoveListener(who) => listeners.filter(_ ne who)
}
protected def notifyListeners(event: Any) = {
listeners.foreach(_.send(event))
}
}
class ImplementingActor extends ListenableActor {
override def receive = {
super.receive orElse {
case Message(content) => println(content)
}
}
}
不隶属于 StackOverflow