2010-03-09 14 views
8

मैंने एक सुनवाई/श्रोता विशेषता लागू की है जिसे अभिनेताओं में जोड़ा जा सकता है। मैं सोच रहा हूं कि श्रोता को स्पष्ट रूप से कॉल करने के बिना किसी अभिनेता को इस शैली की विशेषता को संलग्न करना संभव है, हैडलर विधि?रचनाकार अभिनेता

इसके अलावा मैं अक्का पुस्तकालय में इस कार्यक्षमता को खोजने की उम्मीद कर रहा था। क्या मुझे कुछ याद आ रहा है या क्या कोई कारण है कि अक्का इसमें शामिल नहीं होगा?

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 का विस्तार नहीं, या यदि आप गैर-अभिनेता भी listenable होने के लिए, एक ListenableActor कि listenable साथ अभिनेता फैली बनाने करना चाहते हैं?

फिर आप अभिनेता में receive ओवरराइड करते हैं जैसा आपने ऊपर किया है (सिवाय इसके कि आप super.receive भी कॉल करना चाहते हैं, है ना? - आप बस उस समारोह को संशोधित करना चाहते हैं जो पारित हो गया है)।

+0

खैर यह है बात है, दोनों स्थितियों में मैं फोन करने के लिए eit याद करने के लिए होगा उसका super.receive या * श्रोता हेल्डर *। मैं सोच रहा था कि सामान्य रूप से स्कैला में कोई तंत्र या किसी भी अभिनेता पुस्तकालयों में एक तंत्र था जिसने अभिनेता को सुने जाने योग्य को कुछ भी करने की अनुमति नहीं दी थी, सिवाय इसके कि: * सुनने योग्य * –

+0

के साथ आपको केवल इतना कहना होगा कि 'सुनोएबलएक्टर' 'अभिनेता को बढ़ाता है' के बजाए; 'सुनोएबलएक्टर' के अंदर आप पहले से ही 'प्राप्त' (और, संभवतः, 'प्राप्त करेंथिन') ओवरराइड कर चुके होंगे। दानिय्येल का जवाब भी देखें। –

2

मेरा सुझाव है कि आप अभिनेता का विस्तार करें और 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) 
     } 
    } 
} 
0

यहाँ एक समाधान (शुरुआत स्काला से उदाहरण का एक संशोधित संस्करण) है http://doc.akka.io/docs/akka/snapshot/scala/routing.html

+0

आपने अभी 'विशेषता' को 'कक्षा' में बदल दिया है ... –

2

क्यों नहीं कि मैंने पहले इस सवाल को देखा है, ईआरएम, ठीक है, बेहतर कभी नहीं से देर से:

संबंधित मुद्दे