Scala Общие подтипы и торт
У меня есть следующая иерархия классов:
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]
Что мне не хватает?
2 ответа
Решение
Тип обработчика тоже нужно было параметризовать:
scala> class Handler[T<:Event] {
| self:Action[T] =>
| def handle(event:T) = act(event)
| }
defined class Handler
@Ashalynd правильно. до проголосовал. также для извлечения логики наследования в более чистый код выглядит так:
class PARENT
class CHILD extends PARENT
trait A[T <: PARENT]
trait AA extends A[CHILD]
class B[T <: PARENT] {
self: A[T] =>
}
val b = new B[CHILD]() with AA