Я пытаюсь реализовать признак Pub/Sub для смешивания с другими аккскими актерами с использованием стекируемого признака.
Вот что я придумал:
trait PubSubActor extends Actor {
abstract override def receive =
super.receive orElse {
case Subscribe(topic) => /* ... */
case Publish(topic, msg) => /* ... */
}
}
class MyActor extends Actor with PubSubActor {
override def receive = {
case SomeMessage(a, b, c) => /* ... */
}
}
В этот момент компилятор возвращает ошибку: ошибка: переопределяющий метод получения в признаке метода MyActor... get требует модификаторов абстрактного переопределения.
Можете ли вы объяснить мне, почему это не работает? Как я могу исправить это, чтобы он работал?
Спасибо!
UPDATE
Следующие работы:
trait PubSubActor extends Actor {
abstract override def receive =
super.receive orElse {
case Subscribe(topic) => /* ... */
case Publish(topic, msg) => /* ... */
}
}
class MyActor extends Actor {
override def receive = {
case SomeMessage(a, b, c) => /* ... */
}
}
class MyActorImpl extends MyActor with PubSubActor
Но почему? Почему я могу получить такое поведение, которое хочу, но не другое? Любые причины? Я не могу понять, что разница между этими двумя образцами делает разницу.