Класс Scala с чертами издателя и подписчика - PullRequest
2 голосов
/ 20 апреля 2011

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

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

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

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

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

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

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

Ответы [ 2 ]

5 голосов
/ 20 апреля 2011

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

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

class PubSub[Evt, Pub2] extends Subscriber[Evt, Pub2] with Publisher[Evt]{
  def notify(pub: Pub2, evt: Evt){
  }
}
2 голосов
/ 20 апреля 2011

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

...