Унаследовать поведение обработки сообщений - PullRequest
2 голосов
/ 17 сентября 2011

У меня есть некоторые события в моей модели и немного логики обработки.Я хочу организовать общение логики броска Актеров.Но как я могу наследовать логику обработки, не указывая act() в каждом конкретном классе

Упрощенный пример

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{}

1 Ответ

5 голосов
/ 17 сентября 2011

react ожидает PartialFunction[Any, Unit], и вы можете красиво составить их вместе.Вот пример:

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)
...