У меня проблема с моим дизайном. Я просто хочу это сделать, но я не могу этого добиться. Составитель жалуется на методе процесс не реализован в MyProcessor так MyProcessor должны быть абстрактными ...Scala akka: реализовать абстрактный класс с параметром подтипа
trait Event
abstract class EventProcessor extends Actor{
def receive ={
case evt : Event => process(evt)
case evts : Iterable[Event] => process(evts)
}
def process(event :Event): Iterable[SomeObject]
def process(events :Iterable[Event])={
events.flatMap(process)
}
}
case class MyEvent extends Event
class MyProcessor extends Processor{
def process(event :MyEvent)={
some processing...
}
}
Я уверен, что это хорошо известный шаблон. Каков ваш метод?
мне нужно 2 вещи:
- Как правильно реализовать подкласс с параметром типа
- Как пройти через тип стирания (как в первом, опишите ответ?)?
EDIT: решение
trait Event
abstract class EventProcessor[T<:Event:ClassTag] extends Actor{
def receive ={
case evt : T=> process(evt)
case evts : Iterable[T] => process(evts)
}
def process(event :T): Iterable[SomeObject]
def process(events :Iterable[T])={
events.flatMap(process)
}
}
case class MyEvent extends Event
class MyProcessor extends Processor[MyEvent]{
def process(event :MyEvent)={
some processing...
}
}
Существует действительно проблема в вашем дизайне. Вы говорите, что EventProcessor может обрабатывать любые события, но MyProcessor может обрабатывать только MyEvent. У вас не может быть что-то вроде супертипа, а затем сделать подтип, который нарушает обещание. Вам нужно либо ограничить оригинальный договор супертипа, либо расширять контракт подтипа, чтобы последний охватывал первый. –