如何在Scala中架构以下继承问题?

时间:2011-08-24 12:45:33

标签: scala

假设我有以下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 :(得分:0)

BusinessLogic无法在施工时获得Data。如果RealTimeDataHistoricalData没有共同的祖先( 你的问题?),那么最好将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