2016-06-02 3 views
1

У меня проблема с моим дизайном. Я просто хочу это сделать, но я не могу этого добиться. Составитель жалуется на методе процесс не реализован в 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... 
    } 
} 
+0

Существует действительно проблема в вашем дизайне. Вы говорите, что EventProcessor может обрабатывать любые события, но MyProcessor может обрабатывать только MyEvent. У вас не может быть что-то вроде супертипа, а затем сделать подтип, который нарушает обещание. Вам нужно либо ограничить оригинальный договор супертипа, либо расширять контракт подтипа, чтобы последний охватывал первый. –

ответ

1

Вам нужен параметр типа:

abstract class EventProcessor[T <: Event] { 
    def process(event: T) 
} 
class MyProcessor extends Processor[MyEvent] { 
    def process(event: MyEvent) 
} 
+0

Извините, я быстро пошел на упрощение кода. Я обновил свой вопрос ... но спасибо за ваш ответ – vgkowski

+0

Я не вижу много нового в отредактированной версии. Тот же ответ применяется: замените все вхождения 'Event' на' T' в суперклассе. – Dima

+0

разница в сопоставлении с образцом, но мне кажется, мне нужен ClassTag – vgkowski

Смежные вопросы