Как мне спроектировать следующую проблему наследования в Scala? - PullRequest
0 голосов
/ 24 августа 2011

Предположим, у меня есть следующие классы Java. Они не могут быть изменены

class RealtimeData {
    protected void onEvent(Object obj) {
        ...
    }
}

class HistoricalData {
    protected void onEvent(Object obj) {
        ...
    }
}

В Scala у меня есть класс BusinessLogic, который не требует перекомпиляции при переключении с исторических данных на живые. Я пробовал что-то вроде следующего

trait Realtime extends RealtimeData {
    override def onEvent(obj: Any) {
        // my processing here
    }
}

тогда

new BusinessLogic with Realtime

С мыслью, что я тоже могу сделать

new BusinessLogic with Historical

К сожалению, я столкнулся с проблемой компиляции наследования. Существуют ли альтернативные способы достижения общей цели без перекомпиляции BusinessLogic?

1 Ответ

0 голосов
/ 24 августа 2011

Невозможно BusinessLogic просто получить Data при строительстве.Если RealTimeData и HistoricalData не имеют общего предка (это , это ваша проблема?), То, вероятно, лучше всего определить службу, используемую BusinessLogic, как черту и добавить неявные преобразования.

trait Data { def onEvent(obj: Any) }
object Data {
  implicit def fromRealTime(r: RealTimeData) = new Data{
    def onEvent(obj: Any) = r.onEvent(obj)
  // same for Historical
}

class BusinessLogic[D <% Data](data: D) 

В качестве альтернативы, вам нужно добавить поведение в свой класс данных Java, опять же, неявным может быть путь.Тем не менее, с чертой data, неявными преобразованиями и параметром в конструкторе, вы можете добавить еще одно неявное преобразование

object BusinessLogic {
  implicit def extendedWithBusinessLogic[D <% Data](data: D) = new BusinessLogic(data)
}

Наконец, вы также можете рассмотреть структурные типы, наиболее близкие к тому, что вы пробовали,но я не уверен, что понимаю, зачем:

type Data = {def onEvent(obj: Any)}
trait BusinessLogic{self: Data => 
  def onSeveralEvents(objs: Any*) = for (obj <- objs) onEvent(obj)
}
val historicalWithBusiness = new HistoricalData with BusinessLogic
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...