質問
俳優に追加できるリスニング可能な/リスナーの特性を実装しました。このスタイルの特性を俳優に明示的に呼び出す必要がないかどうか疑問に思っています リスナーハンドラー 方法?
また、Akka Libraryでこの機能を見つけることを期待していました。私は何かが足りないのですか、それとも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