2011-09-17 3 views
2

J'ai des événements dans mon modèle et une certaine logique de traitement. Je veux organiser la logique de communication jeter Acteurs. Mais comment je peux hériter la logique de manipulation sans spécifier act() dans chaque classe concrèteComportement de gestion des messages hérités

exemple simplifié

class Event {} 

case class FooEvent(str : String) extends Event 
case class BarEvent(i : java.lang.Integer) extends Event 

trait FooListener extends Actor { 
    def act() { 
    react{ 
     case FooEvent => print("foo received") 
    } 
    } 
} 
trait BarListener extends Actor { 
    def act() { 
    react{ 
     case BarEvent => print("bar received") 
    } 
    } 
} 
class ListensOnlyBar extends BarListener{} 

//can't be done: 
//error: overriding method act in trait FooListener of type()Unit; 
//method act in trait BarListener of type()Unit needs `override' modifier 
//class ListensBarAndFoo extends FooListener with BarListener{ 
class ListensBarAndFoo extends FooListener with BarListener{} 
+0

@Kipton Barros, C'est quoi la question. Y a-t-il un moyen de les combiner? –

+0

@Kipton Barros, 'FooEvent's devrait être géré par' FooListener' et 'BarEvent's par' BarListener'. –

+1

Je vois, puis tenshi a une bonne réponse. Ce que vous voulez n'est pas vraiment quelque chose qui peut être fait avec l'héritage. En passant, si vous mettez des modificateurs "override" sur vos méthodes 'act()', alors la linéarisation fera que la méthode 'act()' la plus à gauche (de 'FooListener') gagne dans la sous-classe (ListensBarAndFoo'). –

Répondre

5

react attend PartialFunction[Any, Unit] et vous pouvez composer bien ensemble. Voici un exemple:

type Listener = PartialFunction[Any, Unit] 

val foo: Listener = { 
    case FooEvent => print("foo received") 
} 

val bar: Listener = { 
    case BarEvent => print("bar received") 
} 

case class GenericListener(listener: Listener) extends Actor { 
    def act() { 
    react(listener) 
    } 
} 

GenericListener(bar) 
GenericListener(foo orElse bar) 
Questions connexes