有些问题与这个问题有些相关,但它们似乎不太合适。如何在Scala中使用类型参数声明匿名mixin
我正在使用Cake模式在生产代码中滑动“存储”系统,并在测试目的中存储存根存储系统。这非常棒,但是有一个类正在原始类中实例化,这个类还需要混入这个存根存储系统。由于它隐藏在实现中,因此我无法访问它。
事情是这样的:
class Main { this: Storage =>
...
val used = Used(...)
...
}
class Used { this: Storage =>
...
}
当测试 “已使用” 我只是new Used with StubStorage
和关闭我去。我曾经在Main
上做过同样的事情,但那是在使用Used
之前。现在Main
做出了一个天真的例子Used
我有这个问题。
我想试试这样说:
class Main[T <: Storage] { this: T =>
...
val used = Used[T](...)
...
}
class Used[T <: Storage] { this: T =>
...
}
object Used {
def apply[T <: Storage](...) = new Used(...) with T
}
当然,因为编译器没有足够的信息来发现T
不工作,但。这是否有一个神奇的秘诀?我已经玩了一下,看起来很麻烦,标准的面向对象注入方法实际上没有那么麻烦,但我可能会错过一些东西。
我已经看过隐含的工厂概念,但我不能把它变成为mixin工作的形状。
编辑:这是公开写出问题的清晰度令人惊讶。 :)我还没有解决的问题,我原本打算的方式,但有一个简单的解决实际问题:
trait UsedProvider {
def createUsed = Used.apply _
}
class Main { this: Storage with UsedProvider =>
val used = createUsed(...)
}
那我就只是做测试如下:new Main with StubStorage with StubUsedProvider
。
这将只允许我创建一个,我需要一个以上的,这是不是在原来的问题是清楚的。我需要的是一种工厂方法,允许我在需要时创建它们。所以我只是再次使用好的蛋糕模式来给我这种依赖。 – 2011-06-01 10:16:31