2015-01-08 37 views
1

我有下面的類層次結構:斯卡拉通用亞型和蛋糕模式

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] 

我缺少什麼?

回答

1

處理程序類型必須得參數化:

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