2011-05-31 82 views
3

有些问题与这个问题有些相关,但它们似乎不太合适。如何在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

回答

0

我还没有解决您的原始问题,但是您是否考虑过使用抽象类Main并在需要时提供used的值?

abstract class Main { this: Storage => 
    val s = "s" 
    val used: Used 
} 

然后实例是这样的:

val main = new Main with StubStorage { val used = new Used(s) with StubStorage } 
+0

这将只允许我创建一个,我需要一个以上的,这是不是在原来的问题是清楚的。我需要的是一种工厂方法,允许我在需要时创建它们。所以我只是再次使用好的蛋糕模式来给我这种依赖。 – 2011-06-01 10:16:31