2010-03-09 80 views
8

我已經實現了一個可以添加到Actor的Listenable/Listener特質。我想知道是否可以將這種風格的特質附加到演員身上,而不必明確地調用監聽器處理器方法?創作演員

此外,我期待在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()) 
    } 
} 

回答

5

爲什麼不直接延伸Actor,或者如果你想非演員要收聽還,創建與收聽延伸演員一個ListenableActor?

然後,你可以在Actor中覆蓋receive,就像你以前所做的一樣(除非你想要調用super.receive也是,不是嗎? - 你只是想修改傳入的函數)。

+0

嗯,這是東西,在這兩種情況下,我會記得打電話EIT她的super.receive或* listenerHanlder *。我想知道在Scala中是否有一種機制,或者是任何允許演員實現Listenable的Actor庫都不需要執行任何操作,只需說出:* with Listenable * – 2010-03-09 22:11:35

+0

但是,您只需要說'extends ListenableActor'而不是'擴展Actor';在'ListenableActor'裏面,你已經重寫了'receive'(並且可能是'receiveWithin')。又見但以理的回答。 – 2010-03-10 15:02:02

2

我建議你擴展Actor並使用abstract override

0

這裏是一個解決方案(從初級斯卡拉的例子的修改版本):

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) 
     } 
    } 
} 
+0

你剛剛把'trait'改成了'class' ... – 2011-12-30 16:13:21