Класс Scala с признаками издателя и подписчика

#scala #scala-2.8 #publish-subscribe

#scala #scala-2.8 #опубликовать-подписаться

Вопрос:

Используя импорт scala.collection.mutable.{Издатель, подписчик} Я пытаюсь реализовать класс, который подписывается на события и публикует события. Например, этот класс может получать необработанные данные, работать с ними, а затем публиковать результат другим подписчикам.

Базовый класс, который расширяет возможности подписчика:

 scala> class Sub[Evt, Pub]() extends Subscriber[Evt, Pub]{
  def notify(pub: Pub, evt: Evt){
  }
}
defined class Sub
  

Базовый класс, расширяющий Publisher:

 scala> class Pub[Evt]() extends Publisher[Evt]{}
defined class Pub
  

Теперь я хочу объединить эти два:

 scala> class PubSub[Evt, Pub] extends Subscriber[Evt, Pub] with Publisher[Evt]{
  def notify(pub: Pub, evt: Evt){
  }
}
<console>:26: error: class PubSub needs to be abstract, since method notify in
trait Subscriber of type (pub: Pub,event: Evt)Unit is not defined class 
PubSub[Evt,Pub] extends Subscriber[Evt, Pub] with Publisher[Evt]{
  

Метод notify определен, поэтому, возможно, ошибка вводит в заблуждение.

Я не уверен, как определить параметры типа для класса PubSub, которые могут быть частью проблемы.

Ответ №1:

Проблема в том, что издатель класса определяет тип Pub, который затеняет общий аргумент Pub.

Просто переименуйте его во что-нибудь другое:

 class PubSub[Evt, Pub2] extends Subscriber[Evt, Pub2] with Publisher[Evt]{
  def notify(pub: Pub2, evt: Evt){
  }
}
  

Ответ №2:

Я полагаю, вам следует взглянуть на статью, осуждающую шаблон Observer. описанный там пакет scala.react не выпущен как часть стандартного дистрибутива, но некоторый снимок доступен на домашней странице автора. Если вы не планируете использовать его в производственных системах прямо сейчас, этот проект может предоставить достаточную игровую площадку.