【问题标题】:Scala class with Publisher and Subscriber traits具有发布者和订阅者特征的 Scala 类
【发布时间】:2011-08-09 04:30:39
【问题描述】:

使用 import scala.collection.mutable.{Publisher, Subscriber} 我正在尝试实现一个订阅事件和发布事件的类。例如,此类可能会接收原始数据,对其进行操作,然后将结果发布给其他订阅者。

扩展订阅者的基本类:

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 类定义类型参数,这可能是问题的一部分。

【问题讨论】:

    标签: scala scala-2.8 publish-subscribe


    【解决方案1】:

    问题在于 Publisher 类定义了一个 Pub 类型,它隐藏了通用 Pub 参数。

    只需将其重命名为其他名称:

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

    【讨论】:

      【解决方案2】:

      我相信你应该看看Deprecating the Observer Pattern 的论文。此处描述的 scala.react 包并未作为标准发行版的一部分发布,但作者的 homepage 上提供了一些快照。如果您现在不打算在生产系统中使用它,这个项目可以提供足够的游乐场。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-11
        • 1970-01-01
        • 1970-01-01
        • 2016-12-14
        • 2022-12-11
        • 1970-01-01
        相关资源
        最近更新 更多