2013-01-09 7 views
6

Ich benutze die Akka-Darsteller-Bibliothek hier. Die Akteursbibliothek definiert eine Teilfunktion "Empfangen", die ein Akteur, der "Akteur" erweitert, implementieren muss, um mit verschiedenen Nachrichten umzugehen. Ich erstelle eine Merkmalshierarchie für meine Anwendung, wo die Eigenschaft "clockActor" Actor erweitert und "MasterClock" und "SubClock" "clockActor" erweitern. Ich schaue, um die allgemeine Funktionalität der Uhren in die Empfangsfunktion "Uhr" Eigenschaft hinzuzufügen, aber dann, wie füge ich zusätzliche Funktionalität der Empfangsfunktion in den Master-und Sub-Uhr-Traits?Erweitern einer teilweise implementierten Teilfunktion in der Skala

Kurz gesagt, ich brauche einen Weg, um zusätzliche Fallanweisungen zu einer Teilfunktion hinzuzufügen. Ideen?

+2

mit komponieren konnten, können Sie Teilfunktionen zusammensetzen mit [ 'orElse'] (http://www.scala-lang.org/api/current/index .html # scala.PartialFunction). Würde es den Trick machen? – 4e6

+0

Nicht wirklich. Die akka-Bibliothek erledigt all ihre Nachrichten, indem sie intern anruft, so dass ich dort nicht hinkommen kann, um den Anruf anzukündigen. – Alex

+0

in der Tat, ja, oder Else tut genau das, was ich brauche. Schlampig googeln und nur das erste Ergebnis auswählen ließ es anders aussehen, aber ich habe es jetzt funktioniert. – Alex

Antwort

11

Wie bereits angedeutet, Sie leicht PartialFunctionsorElse

trait ClockActor { 

    def commonOp = { 
     case ... => ... 
    } 

} 

class MasterClock extends Actor with ClockActor { 

    def receive = commonOp orElse masterOp 

    def masterOp = { 
     case ... => ... 
    } 

} 

class SubClock extends Actor with ClockActor { 

    def receive = commonOp orElse subOp 

    def subOp = { 
     case ... => ... 
    } 

} 
1

Eine Sache, die den Sinn kommt, ist so etwas wie dies zu tun:

trait ClockActor { 
    def pf:PartialFunction[String, Boolean] = { 
    case "a" => true 
    case v if(_pf.isDefinedAt(v)) => _pf.apply(v) 
    } 

    def _pf:PartialFunction[String, Boolean] = Map.empty 
} 

object MasterClock extends ClockActor { 

    override def _pf:PartialFunction[String, Boolean] = { 
    case "b" => false 
    } 

    println(pf("a")) 
    println(pf("b")) 

} 

die folgende Ausgabe:

scala> MasterClock 
true 
false 

Der Wert true von der Definition in der Teilfunktion des Trait kommt ClockActor , kommt die false von dem Objekt MasterClock.

+0

Ja, das funktioniert. Ich schien die Idee zu haben, dass man beim Überschreiben einer Funktion das Original nicht anfassen kann. Wenn ich es dann tun muss, werde ich diese Art der Ausführung von Dingen verwenden, aber ich suche mehr nach einer Möglichkeit, dass Leute, die die Unterklassen implementieren, sich nicht darum kümmern müssen, super oder irgendeine Implementierung in dem Elternmerkmal zu nennen. – Alex

+0

@Alex, Ich habe eine schnelle Bearbeitung vorgenommen, die mehr dazu beitragen könnte, was Sie erreichen möchten. Ich änderte das Merkmal, um zwei Funktionen zu haben, ein pf, das öffentlich wäre, und das pf, das standardmäßig leer ist und in der Klasse wie nötig überschrieben würde. Es ist im Wesentlichen das gleiche wie das, was ich vorher hatte, aber auf diese Weise muss sich der Benutzer keine Sorgen über den Aufruf von Super machen, da die öffentlichen Aufrufe zu der "pf" -Funktion des Merkmals gehören würden. – jcern

+0

Eine Version funktioniert, aber eine völlig andere Art und Weise. 'Klasse MasterNode erweitert treeNode { def masterReceive: Receive = { case "specificBehaviour"=> {println ("Ich wie ein Meister bin zu verhalten")}} Überschreibung def erhalten = masterReceive OrElse super.receive } ' Wo erhalten ist die Methode, die ich gezwungen bin, in der Elterneigenschaft zu implementieren, und ich nur eine neue Teilfunktion für das neue Verhalten in der Unterklasse erstellen und sie mit orElse verketten. – Alex

Verwandte Themen