Scala 通用子类型和蛋糕模式

标签 scala cake-pattern

我有以下类层次结构:

  abstract class Event(val timeStamp:Long,val id:Long ) 
  case class StudentEvent(override val timeStamp:Long, override val id:Long, 
      firstName:String,lastName:String) extends Event(timeStamp,id )
  case class TeacherEvent(override val timeStamp:Long, override val id:Long, 
      firstName:String,lastName:String.....) extends Event(timeStamp,id)

现在我有以下特点:

trait Action[T <: Event] {
  def act[T](event:T)
}

现在我想将这一特质推广给学生和老师:

trait StudentAction extends Action[StudentEvent]{
   def act(event:StudentEvent) = println(event)
}

trait TeacherAction extends Action[TeacherEvent]{
   def act(event:TeacherEvent) = println(event)
}

现在我想创建 Handler 类,它可以处理所有类型的事件:

class Handler{
  self:Action[Event] =>
  def handle(event:Event) = act(event)
}

现在,当我尝试为某种类型的事件创建处理程序时,我收到编译错误:

val studentHandler = new Handler with StudentAction

illegal inheritance; self-type Handler with StudentAction does not conform to Handler's selftype Handler 
 with Action[Event]

我错过了什么?

最佳答案

处理程序类型也必须参数化:

scala> class Handler[T<:Event] {
     | self:Action[T] =>
     | def handle(event:T) = act(event)
     | }
defined class Handler

关于Scala 通用子类型和蛋糕模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27841887/

相关文章:

scala - 如何从数据帧中提取数据帧的子集

scala - 在 Scala 中使用 Cake 模式和函数之间的区别 - 为什么 Cake 模式有用?

java - Java8 的蛋糕模式可能吗?

scala - 蛋糕图案——为什么这么复杂

haskell - Scala 的 Cake Pattern 可以在 Haskell 中实现吗?

java - 无法启动 Java 客户端 1.5.0 NoSuchMethodException

Scala BigDecimal 除法

Scala:链接多个 Option.when 调用

java - 将类路径传递给 buildr 中基于 java/scala 的项目中的自定义任务