문제
배우에게 추가 할 수있는 청취 가능한/청취자 특성을 구현했습니다. 이 스타일의 특성을 명시 적으로 호출하지 않고도 배우에게 첨부 할 수 있는지 궁금합니다. 리스너 핸들러 방법?
또한 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
.
왜 전에이 질문을 보지 못했습니다.
다음은 솔루션 (시작 스칼라에서 예제의 수정 된 버전)입니다.
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)
}
}
}
Akka에는 이에 대한 내장 지원이 있습니다. https://github.com/jboner/akka/blob/release-1.2/akka-actor/src/main/scala/akka/routing/listeners.scala
제휴하지 않습니다 StackOverflow