假设我有以下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的总体目标?
答案 0 :(得分:0)
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