문제

배우에게 추가 할 수있는 청취 가능한/청취자 특성을 구현했습니다. 이 스타일의 특성을 명시 적으로 호출하지 않고도 배우에게 첨부 할 수 있는지 궁금합니다. 리스너 핸들러 방법?

또한 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.

왜 전에이 질문을 보지 못했습니다.

http://doc.akka.io/docs/akka/snapshot/scala/routing.html

다음은 솔루션 (시작 스칼라에서 예제의 수정 된 버전)입니다.

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)
        }
    }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top